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

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

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

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

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

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

16 ответов

24 просмотра

Анализатор и 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 уронит процесс целиком, вместе с утечкой.

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

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

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

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

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

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

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

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

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

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта