У меня есть класс, предназначенный для загрузки файлов изображений в растровые изображения и сохранения ссылок на эти растровые изображения. Я хочу освободить эти ресурсы в какой-то момент позже, например, перед закрытием приложения.
Итак, мой класс (одноэлементный) спроектирован так:
class ImageManager
{
public:
static ImageManager &getInstance();
ImageManager(ImageManager const&) = delete;
void operator=(ImageManager const&) = delete;
void loagImage(char *location);
~ImageManager();
private:
ImageManager();
ALLEGRO_BITMAP *image = nullptr;
}
На самом деле в конструкторе нет ничего особенного. Просто загружает надстройку, связанную с обработкой растровых изображений. Необработанные указатели не создаются.
loadImage()
реализовано, как показано ниже:
void ImageManager::loadImage(char *location)
{
if(!location)
{
throw std::invalid_argument("Location cannot be null.");
}
image = al_load_bitmap(location);
}
Деструктор определяется как
ImageManager::~ImageManager()
{
if(image)
{
al_destroy_bitmap(image); // Here I get the access violation exception.
}
}
То, как этот класс используется в main.cpp
, выглядит так:
int main(int argc, char *args[])
{
ImageManager &imgManager = ImageManager::getInstance();
imgManager.loadImage("valid/location");
return 0;
}
Если я вызову al_destroy_bitmap()
в той же функции, которая загружает растровое изображение, ошибки не будет. Это происходит только тогда, когда я пытаюсь вызвать его в деструкторе.
Я на Windows 10, используя VS17. Я видел ряд вопросов по той же теме, но я не мог понять ошибку, используя ответы там. Я также дам ссылку на два метода аллегро здесь, если вам нужно:
РЕДАКТИРОВАТЬ:
Мой метод getInstance()
:
ImageManager &ImageManager::getInstance()
{
static ImageManager instance;
return instance;
}
РЕДАКТИРОВАТЬ 2:
Точная ошибка 0xC0000005: Access violation reading location 0xDDDDDDF1.
imgManager
передreturn 0
? Битовая карта может быть уже уничтожена до вызоваImageManager::~ImageManager
. - person J.R.   schedule 14.04.2019getInstance()
. - person kovac   schedule 14.04.2019image
наnullptr
вImageManager::~ImageManager
... - person J.R.   schedule 14.04.2019instance
на указатель, созданиеgetInstance
экземпляра и добавление явного вызова 'destroyInstance` для удаленияinstance
передreturn 0
может решить проблему, поскольку вы знаете, что после выхода изmain
у вас больше нет последовательности уничтожения/освобождения, которая находится вне вашего контроля. - person J.R.   schedule 14.04.2019