C ++ irrlicht Программа падает, когда окно теряет фокус - PullRequest
0 голосов
/ 30 апреля 2019

Я использую Irrlicht, чтобы нарисовать изображение на экране, используя код ниже. Я в основном получаю данные изображения из моего класса рисования, преобразую их в IImage, преобразую их в секунду, увеличив масштабирование IImage, а затем преобразую в ITexture, которая рисуется на экране. Очевидно, что если я запускаю этот код без удаления или удаления чего-либо, я получаю серьезную утечку памяти, но я заметил странное поведение при удалении текстуры. Если я помещаю tex-> drop () после кода рисования сцены в конце, программа вылетает через несколько секунд. Если я урону текстуру до запуска кода рисования сцены, программа будет работать вечно без явной утечки памяти, пока я не нажму на любое другое окно. Нажатие на другое окно вызовет сбой программы. Я могу щелкнуть окно программы, переместить его и т. Д., Но нажатие на любое другое окно вызывает сбой. Если я вообще уберу строку tex-> drop (), программа допустит нажатие на другие окна, но это приведет к серьезной утечке памяти.

    // get image data, convert to IImage and scale image to 640 by 480
    unsigned char * ppm_data = ppm.get_image_data();
    irr::video::IImage* image = driver->createImageFromData(irr::video::ECF_R8G8B8, irr::core::dimension2d<unsigned int>(320, 240), ppm_data);
    irr::video::IImage* image2 = driver->createImage(irr::video::ECF_R8G8B8, irr::core::dimension2d<unsigned int>(640, 480));
    image2->fill(irr::video::SColor(255, 255, 0, 0));
    image->copyToScaling(image2);

    // convert the scaled image to an ITexture
    irr::video::ITexture* tex = driver->addTexture("NAME", image2);

    // delete the image data
    delete[] ppm_data;
    ppm_data = nullptr;
    image->drop();
    image2->drop();
    tex->drop(); // <-- This line fixes the memory leak but causes crashes when window loses focus


    // draw scene...
    driver->beginScene(true, true, irr::video::SColor(250, 190, 190, 250));
    driver->draw2DImage(tex, irr::core::vector2d<int>(0, 0));
    driver->endScene();

Есть предложения, что я делаю не так? Как заставить программу терпеть нажатия на другие окна без сбоев?

...