逆参照されたポインターを参照で渡すときのC ++ヒープ/スタック割り当ての理解

パブリン

この例では、オブジェクトの作成と破棄で何が起こるかを理解しようとしています。

#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")が削除されないため、メモリリークが発生します

しかし、参照して取っているので、まだメモリリークがありますか?どちらmd持っている彼らのデストラクタが呼ばれるが、これはまた、ヒープメモリを解放しますか?そして、私はどのように考えることができますFamily.dadか?これはスタック変数ですか?もしそうなら、全体Familyがスコープと見なされますか?

私はこの例にかなり混乱していて、それについて推論する方法を本当に知りません。また、delete2つのPersonオブジェクトを明示的に指定しことがないので、ここでもメモリリークが発生しますか?

イゴールR。

全体像を確認するには、copy-constructorを追加してください。

けれどもFamily::Familyそれはメンバーにコピーして、その後、参照によってオブジェクトを取得momしてdadしたがって、観察するデストラクタの呼び出しは、それらのメンバーが破壊されたときに実際に発生します。

プログラムが終了するまで、元のオブジェクトは解放されません。

Personを使用して作成するインスタンスの場所については、newC ++標準に従って、「フリーストア」に割り当てられます。通常、それはそれらがヒープ上に存在することを意味します。

OTOH、Familyインスタンス(およびそのすべてのメンバー)には「自動ストレージ」があります。人気のあるコンパイラ/プラットフォームのほとんどでは、これはスタックに割り当てられることを意味します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Cでアクセスされたときに逆参照するポインターの配列

分類Dev

空のインターフェイスとして渡されたポインター値を逆参照するにはどうすればよいですか?

分類Dev

文字配列が渡されるときに逆参照するポインター

分類Dev

逆参照されたポインタをC ++の定数データにインクリメントできるのはなぜですか?

分類Dev

スタックとヒープのJavaメモリ割り当て

分類Dev

Javaヒープとスタックメモリの割り当て

分類Dev

unique_ptrヒープとスタックの割り当て

分類Dev

C ++クラスメンバー:スタックとヒープの割り当て

分類Dev

応答でポインタ値が割り当てられたときにポインタを逆参照する方法

分類Dev

スタックまたはヒープのどこに変数参照が割り当てられていますか?

分類Dev

逆参照されたポインタを関数の引数として構造体に渡す

分類Dev

逆参照されたNULLポインターへの参照は、C ++での作成時またはアクセス時にUBを生成しますか

分類Dev

逆参照されたスマートポインターのアドレスを、生のポインターを期待する関数に渡す

分類Dev

逆参照されたポインタの型アサーションはメモリ書き込みですか?

分類Dev

cの文字列へのインデックス付き逆参照ポインタに割り当てるときのセグメンテーション違反

分類Dev

スタックとヒープへのメモリ割り当て量(c)

分類Dev

再帰関数でのヒープへの割り当てとスタックへの割り当て

分類Dev

参照解除された2つのポインターを分割できますか?

分類Dev

逆参照されたポインタから元のポインタを返す

分類Dev

逆参照されたポインタのアドレスを文字列オフセットに渡す

分類Dev

ARCを使用したC関数での自己参照の逆参照、参照はintptr_tとして渡されます

分類Dev

C ++スタックとヒープ割り当て

分類Dev

セグメンテーション違反を逆参照せずにポインターをインクリメントしたり、他の(未)定義された不快感を持たせたりすることはできますか?

分類Dev

C ++のメモリ割り当て領域(スタックvsヒープvs静的)

分類Dev

Javaでの静的割り当て-ヒープ、スタック、永続的な生成

分類Dev

ポインターを逆参照した後、異なる値が出力されるのはなぜですか?

分類Dev

逆参照されたポインターを関数の未定義の動作からの参照として返していますか?

分類Dev

動的に割り当てられたポインタを逆参照しようとしたときのセグメンテーション違反

分類Dev

C ++:スタック割り当てオブジェクトへの参照がヒープ割り当てオブジェクトへの参照と同じように扱われるのはなぜですか?

Related 関連記事

  1. 1

    Cでアクセスされたときに逆参照するポインターの配列

  2. 2

    空のインターフェイスとして渡されたポインター値を逆参照するにはどうすればよいですか?

  3. 3

    文字配列が渡されるときに逆参照するポインター

  4. 4

    逆参照されたポインタをC ++の定数データにインクリメントできるのはなぜですか?

  5. 5

    スタックとヒープのJavaメモリ割り当て

  6. 6

    Javaヒープとスタックメモリの割り当て

  7. 7

    unique_ptrヒープとスタックの割り当て

  8. 8

    C ++クラスメンバー:スタックとヒープの割り当て

  9. 9

    応答でポインタ値が割り当てられたときにポインタを逆参照する方法

  10. 10

    スタックまたはヒープのどこに変数参照が割り当てられていますか?

  11. 11

    逆参照されたポインタを関数の引数として構造体に渡す

  12. 12

    逆参照されたNULLポインターへの参照は、C ++での作成時またはアクセス時にUBを生成しますか

  13. 13

    逆参照されたスマートポインターのアドレスを、生のポインターを期待する関数に渡す

  14. 14

    逆参照されたポインタの型アサーションはメモリ書き込みですか?

  15. 15

    cの文字列へのインデックス付き逆参照ポインタに割り当てるときのセグメンテーション違反

  16. 16

    スタックとヒープへのメモリ割り当て量(c)

  17. 17

    再帰関数でのヒープへの割り当てとスタックへの割り当て

  18. 18

    参照解除された2つのポインターを分割できますか?

  19. 19

    逆参照されたポインタから元のポインタを返す

  20. 20

    逆参照されたポインタのアドレスを文字列オフセットに渡す

  21. 21

    ARCを使用したC関数での自己参照の逆参照、参照はintptr_tとして渡されます

  22. 22

    C ++スタックとヒープ割り当て

  23. 23

    セグメンテーション違反を逆参照せずにポインターをインクリメントしたり、他の(未)定義された不快感を持たせたりすることはできますか?

  24. 24

    C ++のメモリ割り当て領域(スタックvsヒープvs静的)

  25. 25

    Javaでの静的割り当て-ヒープ、スタック、永続的な生成

  26. 26

    ポインターを逆参照した後、異なる値が出力されるのはなぜですか?

  27. 27

    逆参照されたポインターを関数の未定義の動作からの参照として返していますか?

  28. 28

    動的に割り当てられたポインタを逆参照しようとしたときのセグメンテーション違反

  29. 29

    C ++:スタック割り当てオブジェクトへの参照がヒープ割り当てオブジェクトへの参照と同じように扱われるのはなぜですか?

ホットタグ

アーカイブ