私はこのコードを書く時:私はポインタを作成していたときに理解ポインタC++
Animal *p;
Animal b;
p = &b;
最初の行を。 Animalの新しいオブジェクトが作成されるのか、2行目を書き込むときだけですか?
ありがとうございました。
私はこのコードを書く時:私はポインタを作成していたときに理解ポインタC++
Animal *p;
Animal b;
p = &b;
最初の行を。 Animalの新しいオブジェクトが作成されるのか、2行目を書き込むときだけですか?
ありがとうございました。
最初の行にはポインタが作成されていますが、まだ何も指していません。 2行目では、実際のAnimal
オブジェクトを作成します。
Animal *p;
ポインタを作成すると、Animal b;
が動物を作成します。
新しいオブジェクトは、そのメソッドが作成されたときにスタック上に作成され、メソッドが戻るときに消えます。メソッドからその値を返すと、スタックメモリがメソッドから戻ってくる部分として割り当て解除されるため、アプリケーションからクラッシュする可能性があります。
言語はクラッシュを保証するものではありません。生存期間が終了した後にオブジェクトにアクセスしようとすると、クラッシュを含む奇妙な結果につながることがあります。 – fredoverflow
真実ですが、すべての実用的な目的のために、クラッシュが予想されます。これが有用な技術であると主張することは、彼のレベルでプログラマーにとって貴重ではない。 –
これは本当にopの質問に答えるのではなく、インスタンス変数へのポインタがあればスコープの問題が発生する可能性があります。 – AJG85
ポインタを宣言すると[宣言は定義です]、ポインタにはスペースしか割り当てられません。Animal
オブジェクトは作成されません。
ポインタを初期化していない場合は、有効なAnimal
オブジェクトをポイントするか、ポインターがポイントしないことを示す特別な「ヌルポインター値」を割り当てる以外には使用できません有効なオブジェクトで実際に有効なAnimal
オブジェクトを指しているかどうかはテストできません。
NULLまたはあなたがそれらを作成するとすぐに有効なオブジェクトにするのいずれかのポインタを初期化するために常に賢明ですので、私はどちらかをお勧めします:
Animal* p = 0; // or = NULL
Animal u;
p = &u;
以上:
Animal u;
Animal* p = &u;
// create a pointer to an animal object and initialize it to NULL
//Animal* p; // Bad! Do not do this
Animal* pA = NULL; // Much better
Animal a; // creates an Animal object on the stack (local scope)
Animal pA = &a; // sets pA to point to the location of a
a
が有効範囲外になると、pA
は依然としてそのメモリ位置を指します。あなたがそれにアクセスしようとすると、悪いことが起きる可能性があります。
2行目の書き込み時のみ。 –