【发布时间】:2018-11-18 22:19:00
【问题描述】:
在这段代码中,如果if 子句为真,则CurrentAccount 构造函数会抛出异常:
void Bank::createAccount(string accountType,int iban,int ownerid,double amount)
{
Account* toAddAccount=nullptr;
if(accountType=="CurrentAccount")
{
toAddAccount=new CurrentAccount(iban,ownerid,amount);
}
}
如你所见,异常并没有在这个方法中被捕获,而是在堆栈中被提升到更高的位置。
我想知道,由于我不删除toAddAccount(CurrentAccount 构造函数仅适用于整数),会不会出现内存泄漏?
【问题讨论】:
-
不,CurrentAccount 永远不会被创建,因为构造函数永远不会运行到完成,所以没有什么要删除的。
-
抛出异常时没有泄漏,因为它将中止
CurrentAccount对象的构造。由于没有完全创建CurrentAccount对象,因此以后不需要释放它。但是,如果CurrentAccount构造函数没有抛出异常,则存在泄漏,因为您没有删除toAddAccount... -
如果您使用
std::unique_ptr,您不必担心内存泄漏.. -
更重要的是,如果构造函数抛出,则 operator new 的代码调用匹配的 operator delete 以释放分配的内存块(不调用析构函数(因为对象不'存在' ) 但运算符 delete 是)。
-
@RemyLebeau 是真的。更多的是推广智能指针的使用...
标签: c++ memory-management