スタック変数とヒープ変数の仕組みについて、ちょっと質問があります。私の理解では、スタック変数は関数が戻った後に削除される変数で、ヒープ変数は永続的です。しかし、私が本当に混乱しているのは、関数内でヒープ変数を割り当てる方法です。
int MyObject::addObject(const char* a){
MyObject newObject(a);
return 0;
}
のコンストラクターがあるとしMyObject
ますnewObject(const char * a)
。この関数で呼び出されると、戻った後に新しく構築された はnewObject
削除されますか?削除される場合、関数内でヒープに割り当てるにはどうすればよいですか?そうでない場合、後でメモリをクリーンアップするにはどうすればよいでしょうか?
さらに、デストラクタの役割は正確には何であり、いつ呼び出されるのでしょうか?
ベストアンサー1
クラスのコンストラクタMyObject
は でありMyObject()
、 ではありませんnewObject()
。あなたの例では、newObject
はコンストラクタではなく変数の名前です。
関数内でヒープ領域を割り当てるには、次のnew
演算子を呼び出す必要があります。
int MyObject::addObject(const char* a){
MyObject* newObject = new MyObject(a);
//newObject is allocated on the heap
//... Some more code...
delete newObject;
//you have to explicitly delete heap-allocated variables
//if not, you get memory leaks
return 0;
}
あなたのコード:
MyObject newObject(a);
MyObject
と呼ばれる自動ストレージ (スタック) を作成します。newObject
これは、宣言されたスコープが終了するまで (つまり、閉じるまで) 存続します}
。
さらに、デストラクタの役割は正確には何であり、いつ呼び出されるのでしょうか?
new
またはnew[]
(または)で割り当てられ、所有されているクラス内のメモリをクリーンアップしますmalloc
。これは、自動オブジェクトの場合、オブジェクトがスコープ外になったとき、または動的オブジェクトの場合、明示的に呼び出されたときに呼び出されますdelete
。