Объект Gdiplus::Image и boost::shared_ptr

У меня есть простой класс кеша изображений в моем приложении MFC, чтобы отслеживать изображения, загружаемые из файловой системы:

typedef boost::shared_ptr<Gdiplus::Image> ImagePtr;
typedef std::map<std::string, ImagePtr> ImageMap;

Всякий раз, когда изображение запрашивается по имени файла, выполняется поиск или, если оно уже загружено, возвращается соответствующий ImagePtr.

Проблема возникает, когда я выхожу из своего приложения, и общий указатель уничтожается. Я получаю нарушение прав доступа здесь, в checked_delete.hpp:

// verify that types are complete for increased safety

template<class T> inline void checked_delete(T * x)
{
    // intentionally complex - simplification causes regressions
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
    (void) sizeof(type_must_be_complete);
    delete x; // <-------- violation here!!
}

Управляет ли GDI+ этими объектами за меня? Если да, то что мне нужно сделать с моим shared_ptr, чтобы он не вызывал удаление? Или что-то еще не так?

Заранее спасибо!


person Moo-Juice    schedule 26.01.2011    source источник


Ответы (1)


Это может быть признаком вызова GdiplusShutdown до уничтожения указателей.

person Mark Ransom    schedule 26.01.2011
comment
Хм, на самом деле я не вызываю это явно. Но вы поднимаете интересный момент, потому что я полагаюсь на интеллектуальные указатели, а кэш изображений будет уничтожен деструктором класса, производного от CWinApp, который у меня есть. Пора что-нибудь попробовать :) - person Moo-Juice; 26.01.2011
comment
Превосходно! Спасибо, что указали мне правильное направление. Я вызвал clear() для своих кешей в ExitInstance вместо того, чтобы позволить им уничтожиться, и вуаля, нарушения прав доступа нет. - person Moo-Juice; 26.01.2011