Microsoft C ++ исключение runtime_error в ячейке памяти (код 0x75A818A2) - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть следующее определение класса:

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).Теперь исключение исчезло.Я действительно ценю, если кто-то может пролить больше света на это.Может быть, оператор копирования копирования отключен?

1 Ответ

0 голосов
/ 19 апреля 2019

надеюсь, что это поможет вам увидеть комментарий ниже:

void DisplayManager::addDisplay(ALLEGRO_DISPLAY &display)
{
    if(!mDisplay)
    {
        throw std::runtime_error("Failed to create display: A display is already created.");
    }

    mDisplay = &display; // dangerous to do this, mDisplay point to display
//if display is being destroy => mDisplay point to un-legal memory
}

посмотрите, где мы его называем

ALLEGRO_DISPLAY *display = al_create_display(width, height); // problem in here
 //if this function return object which will being destroyed later, then error happen

if(!display)
{
    throw std::runtime_error("Failed to create display");
}

manager->addDisplay(*display); // look at this, when we are out of this 
//and the object above is being destroy, mDisplay point to un-legal memory => exception
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...