この例では、オブジェクトの作成と破棄で何が起こるかを理解しようとしています。
#include <iostream>
class Person {
public:
const int name;
Person() = delete;
Person(int& name) : name(name) {
std::cout << "Person " << name << " created" << std::endl;
}
Person(const int& name) : name(name) {
std::cout << "Person " << name << " created -- copy constructor" << std::endl;
};
~Person() {
std::cout << "Person " << name << " destroyed" << std::endl;
}
};
class Family {
public:
Person mom, dad;
Family() = delete;
Family(Person& m, Person& d) : mom(m), dad(d) {
std::cout << "Family created" << std::endl;
};
Family(const Person& m, const Person& d) : mom(m), dad(d) {
std::cout << "Family created -- copy constructor" << std::endl;
};
~Family() {
std::cout << "Family destroyed" << std::endl;
}
};
int main()
{
Person* m = new Person(1);
Person* d = new Person(2);
Family f(*m, *d);
return 0;
}
この出力
Person 1 created -- copy constructor
Person 2 created -- copy constructor
Family created
Family destroyed
Person 2 destroyed
Person 1 destroyed
だから私はこれをどのように解釈するのか完全にはわかりません。new
キーワードを使用してヒープに割り当てるものはすべて、その後delete
-dにする必要があると教えられました。また、オブジェクトがスコープ外に移動すると、スタック変数は失われます。私の理解はこんな感じです。Person& m
参照で受け入れる代わりに&
、のようにPerson m
、を使用せずに取得した場合、m
ここ(スタック上)にコピーされ、ヒープに割り当てられたものnew Person("Jane")
が削除されないため、メモリリークが発生します。
しかし、参照して取っているので、まだメモリリークがありますか?どちらm
とd
持っている彼らのデストラクタが呼ばれるが、これはまた、ヒープメモリを解放しますか?そして、私はどのように考えることができますFamily.dad
か?これはスタック変数ですか?もしそうなら、全体Family
がスコープと見なされますか?
私はこの例にかなり混乱していて、それについて推論する方法を本当に知りません。また、delete
2つのPerson
オブジェクトを明示的に指定したことがないので、ここでもメモリリークが発生しますか?
全体像を確認するには、copy-constructorを追加してください。
けれどもFamily::Family
それはメンバーにコピーして、その後、参照によってオブジェクトを取得mom
してdad
。したがって、観察するデストラクタの呼び出しは、それらのメンバーが破壊されたときに実際に発生します。
プログラムが終了するまで、元のオブジェクトは解放されません。
Person
を使用して作成するインスタンスの場所については、new
C ++標準に従って、「フリーストア」に割り当てられます。通常、それはそれらがヒープ上に存在することを意味します。
OTOH、Family
インスタンス(およびそのすべてのメンバー)には「自動ストレージ」があります。人気のあるコンパイラ/プラットフォームのほとんどでは、これはスタックに割り当てられることを意味します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加