在此代码中,如果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
构造函数只适用于int),会不会有内存泄漏?
发布于 2018-06-09 04:11:39
这不是泄漏,因为"new expression“负责在执行过程中抛出异常时进行清理。换句话说,“新表达式”分配内存,然后调用CurrentAccount
的构造函数。如果这个构造函数抛出,“新表达式”自动释放先前分配的内存。
发布于 2018-06-09 04:27:34
我认为这个问题已经得到了回答,但在构建对象时应该使用RAII。具体来说(前面已经多次指出)是使用std::unique_ptr
(和make_unique
,具体取决于您的标准)。
Account* Bank::createAccount(string accountType,int iban,int ownerid,double amount)
{
std::unique_ptr<Account> toAddAccount;
if(accountType=="CurrentAccount")
{
toAddAccount=new CurrentAccount(iban,ownerid,amount);
}
// presumably more code
return toAddAccount.release(); // your factories shouldn't care where your accounts are stored.
}
https://stackoverflow.com/questions/50767673
复制相似问题