我有一个类“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
以释放内存?
答案 0 :(得分:2)
在这种情况下,标准C ++行为适用:如果new
调用的构造函数抛出异常,则删除内存。
更确切地说,将调用与调用的operator delete
具有相同原型的new
来释放内存。