170 похожих чатов

Есть следующая задача: Нативная dll возвращает указатель на область памяти, в

которой лежит массив объектов.
Нужно вычитать оттуда объекты самым дешёвым по памяти способом.

Моё решение:
Получаем указатель, и по указателю устанавливаем Span<T>
Написал примерно такую обертку над Span<T> чтобы была возможность подчистить указатель после того как закончили работу

Но по-любому будет ситуация, когда забудут вызвать Dispose() и будет утечка памяти

Что можно придумать, чтобы этого избежать?

16 ответов

28 просмотров

Анализатор и warningsaserror

Никак. Либо делать обёртку-класс, а не структуру и определять финализатор, либо (и так будет получше) включить анализаторы и хлестать тряпками всех, кто забудет почистить. Себя тоже.

https://www.codeproject.com/Articles/29534/IDisposable-What-Your-Mother-Never-Told-You-About

SomebodyOdd
Никак. Либо делать обёртку-класс, а не структуру и...

предлагаешь авторам либ лезть во все проекты где либа будет юзаться и включать там анализаторы?

Qwerty- Автор вопроса
SomebodyOdd
Никак. Либо делать обёртку-класс, а не структуру и...

Надо бы zero allocation, поэтому класс не вариант Пишу либу которую будут юзать другие люди, поэтому анализаторы тоже не вариант Спасибо за помощь, наверное придется выбрать вариант с тряпками :)

floitet malenavaka
предлагаешь авторам либ лезть во все проекты где л...

Эээ. Да? И вроде как оно даже по умолчанию включено, если не ошибаюсь? Если кто-то неправильно пользуется либой (например, забыл почистить за собой), то кто виноват - либа или пользователь?

Qwerty
Надо бы zero allocation, поэтому класс не вариант ...

Если хочешь безопасно, то надо аллоцировать

SomebodyOdd
Эээ. Да? И вроде как оно даже по умолчанию включен...

не только забыл. стаковерфлоу например не ловится файнали

floitet malenavaka
не только забыл. стаковерфлоу например не ловится ...

Вам будет глубоко плевать на утечку памяти, потому что stackoverflow уронит процесс целиком, вместе с утечкой.

SomebodyOdd
Вам будет глубоко плевать на утечку памяти, потому...

ресурс может продолжить висеть в системе пока ос сама не освободит - хз когда

floitet malenavaka
ресурс может продолжить висеть в системе пока ос с...

Файлы и сеть система то уж за вас закроет. Даже видеопамять не поленится отпустить.

ну эвенчуали, да, но это совсем не детерменировано. коннекшн открытый например может долго висеть. и это не только при таких критических ошибках как стэковерфлоу. если у тебя dispose в dispose вызывается и до него будет эррор - до твоего диспоуза может не дойти просто. короче хз, имхо забить хер - так себе совет

floitet malenavaka
ну эвенчуали, да, но это совсем не детерменировано...

Что? ОС в курсе когда процесс умирает и что он за собой держит из ресурсов ОС, в этом как бы и суть процессов. Ну и да - финализатор в .net core не позовется при stackoverflow, ошибка в нем просто уронит процесс (что таки не даст другим финализаторам сработать), а начиная с .net core он в принципе не вызывается при выходе из приложения, даже корректном. Спасибо, не надо, я лучше using напишу и анализатор включу.

SomebodyOdd
Что? ОС в курсе когда процесс умирает и что он за ...

да, согласен, стэковерфлоу не совсем показателен в этом смысле. но может упасть и без него, я написал там в мессадже

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта