2016-01-03 2 views
0

В основном, я пытаюсь выяснить, не является ли Gdiplus :: Bitmap * NULL (или 0). Если удалите его, а затем создайте «новый Gdiplus :: Bitmap()» на месте. Я пытаюсь сделать это, чтобы предотвратить утечку памяти в будущем.C++ Win32 Ошибка программы Gdiplus, пытающаяся удалить Gdiplus :: Bitmap

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

// private 
Gdiplus::Bitmap* last_frame_bmp; 

// public 
foo::foo() { 
    if (last_frame_bmp != NULL) { delete last_frame_bmp; } 
    last_frame_bmp = new Gdiplus::Bitmap(100, 100, PixelFormat32bppPARGB); 
} 

крах, я имею в виду, программа зависает и не запускается.

Любые идеи?

+2

Почему 'Gdiplus :: last_frame_bmp', а не просто' last_frame_bmp'? –

+0

@AlanStokes err, сделал некоторые ошибки копирования и вставки, код теперь выглядит так. –

ответ

0

Решение было установить Gdiplus::last_frame_bmp = NULL в конструкторе класса. Теперь он работает по назначению.

2

Ну, ваш тест неправильный путь - вы только удаляете, если он равен нулю. В любом случае абсолютно безопасно delete нулевой указатель; это не имеет никакого эффекта, так что вам будет намного лучше без условия вообще.

Но ни один хороший код на C++ никогда не делает явного delete; у нас есть умные указатели, чтобы сделать это для нас.

Ваша авария связана с повреждением памяти в другом месте - слишком явным образом new и delete Я бы подумал.

+0

Это была моя ошибка, я тестировал, это было изначально! =. Эта часть, создающая растровое изображение, фактически запускается только один раз. Но я просто хотел добавить чек для этого. Теперь это беспокоит меня, что это останавливает программу. Я также исправил другую проблему. –

+0

Вам все равно не нужно проверять нуль, прежде чем обналичивать 'de! Ete'. И хороший код на C++ почти никогда не использует 'delete' - или действительно' new'. –

+1

@EvanCarslake Вы уверены, что 'last_frame_bmp' был инициализирован, прежде чем пытаться его удалить? Ваш код не показывает, что он настроен на что угодно, поэтому он может иметь случайное значение (не указывая на действительный объект), а затем вы пытаетесь его удалить. Вы должны объявить в точке, где вам нужно использовать переменную; то у вас не будет этой проблемы. –

0

Вы используете неинициализированную переменную.

Изменить его

Gdiplus::Bitmap* last_frame_bmp = nullptr; 

и он будет работать.

BTW: Вы вызываете GdiplusStartup для инициализации GDI +? Вы должны.

+1

Он явно заявлен как глобальный и, следовательно, инициализируется нулем. В любом случае существует неопределенный код между объявлением и 'delete'. –

+0

@AlanStokes C++ не имеет явного «глобального» объявления. Существует статический класс хранения, но он не является статичным. –

+0

@ c-smile alright, я обновил код, чтобы быть более в контексте. Проблема возникла бы от не инициализации. Из-за своего местоположения я не могу его запустить. Он работает, если я инициализирую его раньше. –