У меня есть класс skImage. Этот класс имеет приватный переменный (с общественной собственностью, которая обнажает его)Как C# обрабатывает память
private Image _capturedImage;
конструктор этого класса выглядит так:
public skImage(Image captured) {
_capturedImage = captured;
}
Он также имеет следующий метод:
public bool Invert() {
Bitmap b = new Bitmap(_capturedImage);
unsafe {
//random code not relevant.
}
_capturedImage = b;
b.Dispose();
return true;
}
, а затем он имеет метод save(), который только что вызывает:
_capturedImage.Save(_saveFullLocation);
теперь, если я запустил метод инвертирования, а затем попробую позвонить, он вызывает исключение (параметр недействителен). После того, как он отправил это исключение, похоже, что я избавляюсь от изображения. Я вижу, что я удаляю «b» после метода инвертирования.
Мой вопрос в том, что когда я делаю _capturedImage = b
, это означает, что обе переменные теперь содержат одну ссылку на объект? Я этого не хочу. Я хочу, чтобы b был уничтожен, чтобы освободить память, чтобы GC мог ее собрать. Как передать b в _capturedImage и уничтожить b.
благодаря
будет означать, когда b выходит за рамки (то есть, закон закончен) GC собирает b и освобождает всю связанную с ним память? – masfenix
@masfenix - Ссылка b создается в кадре стека метода Invert - когда этот метод возвращается, b больше не будет существовать. Однако объект, к которому относится b (битмап), все еще будет существовать в куче (пока не будет собран мусор). – mbeckish
Чтобы добавить комментарий к mbeckish, этот объект не будет собирать мусор (ну, не сейчас), потому что битмап по-прежнему указывается _capturedImage. – Brian