コンストラクタ呼び出しの観点からは、基本的に2つの違いはありません。どちらの場合も、クラスのデフォルトコンストラクタが呼び出されてオブジェクトが構築されます。 myclass * abc = new myclass()
の場合、new演算子は新しく作成されたオブジェクトへのポインタを返します。
しかし、主な違いはスタックメモリとヒープ(ダイナミック)メモリの概念にあります。 myclass * abc = new myclass()
という式は、新たに作成されたオブジェクトのメモリをヒープから割り当て、myclass abc
はスタックから割り当てます。この相違点の1つは、スタックに割り当てられた変数に対して、ヒープから要求したメモリを自分で割り当て、割り当てを解除する必要があることです。コンパイラはメモリの削除を行います。関数が戻るが、abc2
のメモリは、コンパイラによって自動的に解放されると、この関数の場合、
void fo()
{
myclass * abc1 = new myclass();
myclass abc2;
// Use the declared variables.
// At the end, is everything OK?
}
次の簡単な関数を考えてみましょう。コンパイラはabc1
ポインタも削除しますが、このポインタが指すメモリについては何も行いません。この微妙な機能により、この機能ではnotorious memoryのリークが発生します。 fo
アドレスの以下の修正版この間違い:
void fo()
{
myclass * abc1 = new myclass();
myclass abc2;
// At the end, manually free the memory that abc1 points to if it is not needed anymore
delete abc1
}
ウィキペディアは、それらについての詳細な情報を提供し、より多くの詳細を提供ヒープとスタックメモリの概念についてvery nice articleを持っています。
あなたはオブジェクトが別の場所に格納されていることを意味しますか?また、ヒープに割り当てられたオブジェクトのポインタが必要ですか?おそらく、あなたを悩ましていることや、あなたが疑問に思っていることについて少し詳しく説明できますか? –
そして、 'new'を使って割り当てられたオブジェクトの破壊を(手動で)管理する必要があります(他のオブジェクトは寿命が終わると自動的に破壊されます)。 – UnholySheep
両方のコードでabcオブジェクトがスタックに作成されましたか?ヒープ内のコンストラクタを作成するとコードにどのような影響がありますか? –