У меня есть следующее определение класса:
class DisplayManager
{
public:
static DisplayManager *getInstance();
DisplayManager(DisplayManager const&) = delete;
void operator=(DisplayManager const&) = delete;
~DisplayManager();
void addDisplay(ALLEGRO_DISPLAY &display);
private:
DisplayManager();
ALLEGRO_DISPLAY *mDisplay = nullptr;
};
Реализация класса:
DisplayManager *DisplayManager::getInstance()
{
static DisplayManager instance;
return &instance;
}
DisplayManager::~DisplayManager()
{}
void DisplayManager::addDisplay(ALLEGRO_DISPLAY &display)
{
if(!mDisplay)
{
throw std::runtime_error("Failed to create display: A display is already created.");
}
mDisplay = &display;
}
DisplayManager::DisplayManager()
{
}
Метод addDisplay()
вызывается другим классом, например:
void Display::createDisplay()
{
auto *manager = DisplayManager::getInstance();
if(!manager)
{
throw std::runtime_error("No diplay manager.");
}
ALLEGRO_DISPLAY *display = al_create_display(width, height);
if(!display)
{
throw std::runtime_error("Failed to create display");
}
manager->addDisplay(*display);
}
В методе addDisplay()
, когда я делаю mDisplay = &display;
, я получаю следующее исключение:
Unhandled exception at 0x75A818A2 in My_Executable.exe: Microsoft C++ exception: std::runtime_error at memory location 0x0073F66C.
Приложение работает, как и ожидалось, несмотря на это исключение.Я не могу понять причину этого исключения.
РЕДАКТИРОВАТЬ 1:
Я пытался поставить try-catch:
try
{
mDisplay = &display;
}
catch(const std::exception&)
{
// Couldn't reach this code.
}
Когда я пытался этоСтранная вещь произошла.Я получаю точно такое же исключение, и оно возникает в строке, содержащей try
...
EDIT 2:
Ссылка на документацию по al_create_display () .Он возвращает необработанный указатель на дисплей.
РЕДАКТИРОВАТЬ 3:
Я подозревал, что причиной является проблема с оператором присваивания.Поэтому я попытался заменить ALLEGRO_BITMAP *mDisplay
на std::vector<ALLEGRO_BITMAP *>
и вместо mDisplay = &display
сделал mDisplay.push_back(&display)
.Теперь исключение исчезло.Я действительно ценю, если кто-то может пролить больше света на это.Может быть, оператор копирования копирования отключен?