わかっているように、コンストラクタとデストラクタはペアになります。C++:関数によって返されたクラス参照のため、コンストラクタとデストラクタがペアになっていません
しかし、次のコードはそのように動作しません。 コンストラクタは2回呼び出されますが、デストラクタは1回だけ呼び出されます。
{
Animal ahe;
ahe = CreateAnimal();
}
詳細については、お読みください。
int main(int argc, char* argv[])
{
Animal ahe;
return 0;
}
動物のコンストラクタとデストラクタは一度だけ呼び出されます両方ことが期待されます。
が動物という名前のクラスがあり、私たちは次のコードがあるとします。 私がコードを実行すると、それは私が期待したものとまったく同じように動作します。
しかし、関数によってAnimalの参照が返されたときには、次のコードについてはかなり奇妙に見えます。 コードを実行すると、コンストラクタは2回呼び出されますが、デストラクタは1回だけ呼び出されます。
#include "stdafx.h"
#include "stdio.h"
#include "iostream.h"
class Animal
{
public:
Animal();
Animal(long age);
~Animal();
private:
long m_age;
};
Animal::~Animal()
{
cout<<"Animal::~Animal()"<<"age="<<m_age<<endl;
}
Animal::Animal()
{
m_age = 1;
cout<<"Animal::Animal()"<<"age="<<m_age<<endl;
}
Animal::Animal(long age)
{
m_age = age;
cout<<"Animal::Animal()"<<"age="<<m_age<<endl;
}
Animal& CreateAnimal()
{
Animal *pAnimal = new Animal(5);
return *pAnimal;
}
int main(int argc, char* argv[])
{
Animal ahe;
ahe = CreateAnimal();
return 0;
}
//出力
Animal::Animal()age=1
Animal::Animal()age=5
Animal::~Animal()age=5
明らかに、最初のオブジェクトのデストラクタが呼び出されていない、なぜ? Animalに、そのデストラクタで解放する必要のあるリソースがたくさんある場合は、問題が深刻な場合があります。
+1 CreateAnimalでオペレータの新しい呼び出しをすばやく見つけることができます。 – stinky472
しかし、コードの出力は、新しいISを介して作成されたオブジェクトのデストラクタを呼び出します。デストラクタが呼び出されていない最初のオブジェクト(Animal ahe;)です。 – Jack
スマートポインタやセマンティクスに言及する価値があります。また、関数内のフリーストアに割り当てられたオブジェクトへの参照を決して返すことは絶対にありません。それは、インターフェイス全体を変更せずに修正できない、さらに隠されたメモリリークであるため、クライアントが削除することを期待するポインタを返すよりもさらに悪いことです。 – stinky472