0

私は C++ の初心者で、ヘッダーで宣言された const ポインターの初期化について混乱しました。一例を挙げると、ヘッダーに次のような構造とクラスがあります。

/* header file.h */
typedef struct A{ ... } A;

class myClass{
    protected:
        A *const myPtrA;
}

また、A が部分構造で構成される非常に複雑な構造であり、動的にインスタンス化する必要があることを知っている場合、コンストラクターなどで myPtrA のコンテンツをインスタンス化する必要があります。

/* source file.cpp */
#include file.h

myClass::myClass() {
   A *tmpA = new A;
   *myPtrA = *tmpA;
}

これは、const ポインター myPtrA を初期化する良い方法ですか? また、新しい呼び出しごとに専用の削除呼び出しが必要な範囲で、行 *myPtrA = *a; の直後にポインター tmpA を削除できますか? myPtrA が指すコンテンツを失うリスクはありませんか?

お時間をいただきありがとうございます(そして私の英語を許してください;))

ああ

4

1 に答える 1

2
*myPtrA = *tmpA;

これは、const ポインター myPtrA を初期化する良い方法ですか?

いいえ、まったく初期化していませんmyPtrA。デフォルトで初期化されているため、値は不定です。不確定な値 ( ) を持つポインターを逆参照すると、*myPtrA動作が未定義になります。

行 *myPtrA = *a; の直後にポインター tmpA を削除できますか? myPtrA が指すコンテンツを失うリスクはありませんか?

はい、安全です。が指すオブジェクトは、myPtrAが指すオブジェクトの (代入による) コピーtmpAです。ただし、動的オブジェクトを割り当ててコピーし、最初に破棄するのはまったく無意味です。コピーを直接作成/変更するだけで済みます。

メンバー ポインターを正しく初期化する方法の例を次に示します。

class myClass{
    protected:
        A *const myPtrA = new A;
};

PS。これを行う方法を学ぶことは役に立ちますが、実際のプログラムでメモリを手動で管理することはほとんどありません。代わりに などの RAII コンテナーを使用しstd::unique_ptrます。

于 2017-05-30T09:50:23.900 に答える