2011-01-06 11 views
0

私はこのコードを書く時:私はポインタを作成していたときに理解ポインタC++

Animal *p; 
Animal b; 
p = &b; 

最初の行を。 Animalの新しいオブジェクトが作成されるのか、2行目を書き込むときだけですか?

ありがとうございました。

+0

2行目の書き込み時のみ。 –

答えて

5

最初の行にはポインタが作成されていますが、まだ何も指していません。 2行目では、実際のAnimalオブジェクトを作成します。

+0

私はプライベートとしてポイナーを作成し、関数内で実際のオブジェクトを作成し、それをポインタに入れます。私が関数を終了すると、新しいオブジェクトは終了しますか? – adir

+1

@adirはいデストラクターが有効範囲外になり、ポインタが無効になると、デストラクタが呼び出されます。それらは、メモリ内の場所を指しているためポインタと呼ばれます。新しいオペレータを使用してヒープに割り当てたインスタンスを作成しない場合、それらを削除することを忘れないでください。そうしないとメモリリークが発生します。 – AJG85

4

Animal *p;ポインタを作成すると、Animal b;が動物を作成します。

1

新しいオブジェクトは、そのメソッドが作成されたときにスタック上に作成され、メソッドが戻るときに消えます。メソッドからその値を返すと、スタックメモリがメソッドから戻ってくる部分として割り当て解除されるため、アプリケーションからクラッシュする可能性があります。

+0

言語はクラッシュを保証するものではありません。生存期間が終了した後にオブジェクトにアクセスしようとすると、クラッシュを含む奇妙な結果につながることがあります。 – fredoverflow

+0

真実ですが、すべての実用的な目的のために、クラッシュが予想されます。これが有用な技術であると主張することは、彼のレベルでプログラマーにとって貴重ではない。 –

+0

これは本当にopの質問に答えるのではなく、インスタンス変数へのポインタがあればスコープの問題が発生する可能性があります。 – AJG85

9

ポインタを宣言すると[宣言は定義です]、ポインタにはスペースしか割り当てられません。Animalオブジェクトは作成されません。

ポインタを初期化していない場合は、有効なAnimalオブジェクトをポイントするか、ポインターがポイントしないことを示す特別な「ヌルポインター値」を割り当てる以外には使用できません有効なオブジェクトで実際に有効なAnimalオブジェクトを指しているかどうかはテストできません。

NULLまたはあなたがそれらを作成するとすぐに有効なオブジェクトにするのいずれかのポインタを初期化するために常に賢明ですので、私はどちらかをお勧めします:

Animal* p = 0; // or = NULL 
Animal u; 
p = &u; 

以上:

Animal u; 
Animal* p = &u; 
0
// 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は依然としてそのメモリ位置を指します。あなたがそれにアクセスしようとすると、悪いことが起きる可能性があります。