下面程序的輸出是:RAII失敗 - 爲什麼這個C++代碼泄漏? - 投構造函數在try塊防止析構函數
開始嘗試
對象()構造函數
開始抓
爲什麼Holder類的析構函數不叫?這是內存泄漏嗎?是否可以在不重新拋出的情況下調用Holder類的析構函數?
#include <iostream>
#include <exception>
class Object
{
public:
Object() { std::cout << "Object() ctor" << std::endl; }
~Object() { std::cout << "~Object() dtor" << std::endl; }
};
class Holder
{
public:
Holder() :myObjectP(new Object())
{
throw std::exception();
}
~Holder()
{
std::cout << "~Holder()" << std::endl;
delete myObjectP;
}
private:
Object* myObjectP;
};
int main(int argc, char* argv[])
{
try
{
std::cout << "begin try" << std::endl;
Holder h;
}
catch (...)
{
std::cout << "begin catch" << std::endl;
}
return 0;
}
你可能想看看[這裏](https://isocpp.org/wiki/faq/exceptions#selfcleaning-members),不知是不是啓發 – Nacho
有可能包住整個構造的一個嘗試/ catch塊,包括初始化列表,但我從來沒有做過,也不記得語法。 –