私が次のようなものを持っているとしましょう:
class obj001
{
public:
obj001() {
std::cout << "ctor == obj001" << std::endl;
}
~obj001() {
std::cout << "dtor == obj001" << std::endl;
}
};
class obj002
{
public:
obj002() {
std::cout << "ctor == obj002" << std::endl;
}
~obj002() {
std::cout << "dtor == obj002" << std::endl;
}
};
class packet001
{
public:
packet001(): p01(NULL), p02(NULL) {
/*p01 = new obj001;
p02 = new obj002;
throw "hahaha";*/
std::cout << "CTOR == PACKET01" << std::endl;
}
~packet001() {
delete p01;
delete p02;
std::cout << "DTOR == PACKET01" << std::endl;
}
void init() {
p01 = new obj001;
p02 = new obj002;
throw "hahaha";
}
obj001* p01;
obj002* p02;
};
そして私がそうするなら:
try
{
packet001 superpack;
superpack.init();
}
catch(char* type)
{
}
その後、init()
失敗し、のDtorsuperpack
が呼び出されます。
しかし、メモリ割り当てをのCtor内に配置するsuperpack
と(もちろん
実行しないでください)
、Ctorが失敗した後、Dtorは呼び出されないため、リークされます。init()
p01
p02
だから、init()
?
ありがとう!