0

我有一个“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* 实例。

我想知道的是,如果构造被抛出中止,是用于仍在使用的不完整实例的内存。我需要delete在 catch-blocks 中调用 myTex 来释放内存吗?

4

1 回答 1

2

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

更准确地说,operator delete将调用与被调用对象具有相同原型的new以释放内存。

于 2013-07-03T12:51:26.770 回答