которой лежит массив объектов.
Нужно вычитать оттуда объекты самым дешёвым по памяти способом.
Моё решение:
Получаем указатель, и по указателю устанавливаем Span<T>
Написал примерно такую обертку над Span<T> чтобы была возможность подчистить указатель после того как закончили работу
Но по-любому будет ситуация, когда забудут вызвать Dispose() и будет утечка памяти
Что можно придумать, чтобы этого избежать?
Анализатор и warningsaserror
Никак. Либо делать обёртку-класс, а не структуру и определять финализатор, либо (и так будет получше) включить анализаторы и хлестать тряпками всех, кто забудет почистить. Себя тоже.
https://www.codeproject.com/Articles/29534/IDisposable-What-Your-Mother-Never-Told-You-About
предлагаешь авторам либ лезть во все проекты где либа будет юзаться и включать там анализаторы?
Надо бы zero allocation, поэтому класс не вариант Пишу либу которую будут юзать другие люди, поэтому анализаторы тоже не вариант Спасибо за помощь, наверное придется выбрать вариант с тряпками :)
Эээ. Да? И вроде как оно даже по умолчанию включено, если не ошибаюсь? Если кто-то неправильно пользуется либой (например, забыл почистить за собой), то кто виноват - либа или пользователь?
Если хочешь безопасно, то надо аллоцировать
не только забыл. стаковерфлоу например не ловится файнали
Вам будет глубоко плевать на утечку памяти, потому что stackoverflow уронит процесс целиком, вместе с утечкой.
Понял, спасибо
ресурс может продолжить висеть в системе пока ос сама не освободит - хз когда
Файлы и сеть система то уж за вас закроет. Даже видеопамять не поленится отпустить.
ну эвенчуали, да, но это совсем не детерменировано. коннекшн открытый например может долго висеть. и это не только при таких критических ошибках как стэковерфлоу. если у тебя dispose в dispose вызывается и до него будет эррор - до твоего диспоуза может не дойти просто. короче хз, имхо забить хер - так себе совет
Что? ОС в курсе когда процесс умирает и что он за собой держит из ресурсов ОС, в этом как бы и суть процессов. Ну и да - финализатор в .net core не позовется при stackoverflow, ошибка в нем просто уронит процесс (что таки не даст другим финализаторам сработать), а начиная с .net core он в принципе не вызывается при выходе из приложения, даже корректном. Спасибо, не надо, я лучше using напишу и анализатор включу.
да, согласен, стэковерфлоу не совсем показателен в этом смысле. но может упасть и без него, я написал там в мессадже
Обсуждают сегодня