Свяжите разрушение объекта (запечатанный) с разрушением неуправляемого буфера - PullRequest
1 голос
/ 25 декабря 2010

Сначала я объясню свою ситуацию: мне интересно использовать растровый конструктор , который принимает scan0, шаг и форматирует , потому что я декодирую мозаичные изображения и хочу выбрать свой собственный.шаг, чтобы я мог декодировать плитки, не заботясь о границах в части декодера.

В любом случае, проблема в том, что документация гласит: The caller is responsible for allocating and freeing the block of memory specified by the scan0 parameter. However, the memory should not be released until the related Bitmap is released.

Я не могу легко освободить буферпотому что растровое изображение затем передается другому классу, который в конечном итоге уничтожит его, и я не могу его контролировать.Есть ли какой-нибудь способ (хак, я знаю), чтобы GC также освободил мой буфер при уничтожении растрового изображения?

(Также приветствуется любое альтернативное решение).

Ответы [ 3 ]

2 голосов
/ 25 декабря 2010

Посмотрите на ConditionalWeakTableКласс .Это специальный словарный класс, в котором на ключи слабо ссылаются, а значения сохраняются, пока ключ жив.

Вы можете создать экземпляр ConditionalWeakTableгде UnmanagedMemoryHandle - это пользовательский класс, который содержит указатель на неуправляемую память и освобождает эту память, когда она удаляется или завершается.Растровое изображение будет слабо упомянуто таблицей;UnmanagedMemoryHandle будет поддерживаться в течение всего времени работы растрового изображения, поэтому неуправляемая память будет освобождена при сборе растрового изображения.

1 голос
/ 25 декабря 2010

Если класс создает неуправляемый ресурс, не позволяйте никому другому уничтожать его, потому что он будет грязным.Используйте неуправляемый ресурс только внутри класса, который его создает.Вы можете клонировать растровое изображение и опубликовать его, например.

0 голосов
/ 25 декабря 2010

Нет, вы здесь потерялись.Проблема в том, что вы снова в C ++, если отслеживаете память, и в основном вы «теряете» ответственность за память.Нет способа понять, когда воспоминание освобождено.

...