我的流产对象的记忆会怎样?

时间:2013-07-03 10:59:16

标签: memory-management c++-cli

我有一个类“Texture”,它在构造函数中检查用户输入的非法值。如果用户输入了非法值,则构造函数会抛出两个异常中的一个,并且执行会从构造函数中跳出并进入相关的catch块。请参阅以下代码:

SSViewer::SSViewer(System::Windows::Forms::Form ^ parentForm, GLsizei iWidth, GLsizei iHeight) : COpenGL(parentForm,iWidth,iHeight)
{
    printf("\nSuper inherited COGL const func GO");
    cbColour = gcnew array<GLfloat>(4); 
    cbColour[0] = 0.7f;
    cbColour[1] = 0.2f;
    cbColour[2] = 0.6f;
    cbColour[3] = 0.4f;
    //Test Texture
    try
    {
        //Test Texture
        Texture* myTex = new Texture("C4 Games 2.png");
    }
    catch(Texture::nonPOTException& e)
    {
        System::String^ err = gcnew System::String(e.what());
        MessageBox::Show(err, "Sprite Sheet Error", MessageBoxButtons::OK, MessageBoxIcon::Stop);
    }
    catch(Texture::InvalidSizeException& e)
    {
        System::String^ err = gcnew System::String(e.what());
        MessageBox::Show(err, "Sprite Sheet Error", MessageBoxButtons::OK, MessageBoxIcon::Stop);
    }
}

该行:

Texture* myTex = new Texture("C4 Games 2.png");

是抛出异常的行。但是,如果它抛出,则在构建myTex完成之前,控件将返回到catch块。显然,我不希望存在这个不完整的,非法初始化的Texture *实例。

我想知道的是,如果构造因throw而中止,那么用于未完成实例的内存仍在使用中。我是否需要在catch-blocks中调用myTex上的delete以释放内存?

1 个答案:

答案 0 :(得分:2)

在这种情况下,标准C ++行为适用:如果new调用的构造函数抛出异常,则删除内存。

更确切地说,将调用与调用的operator delete具有相同原型的new来释放内存。