2012-04-03 7 views
1

別のクラスの1つのように、新しい変数を宣言できますか? ? 、その後、私がやりたい、私はクラスの名前リストと(Listクラスにネスト)ノードがあるとします。C'tor in C++クラス

List::List(int num) 
{ 
Node Nod(num); //creating a new Node which is holding num 
List_Head=&Nod; //List_Head is a Node pointer variable of List class 
} 

私は、私は以下のランタイムエラー得ることをやるたら:

デバッグアサーションが失敗しました!

式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)

任意のヘルプ?

+0

これは基本的なC++です。ローカル(一時的な)変数のアドレスを割り当てます。c'torスコープから出ると、 'Nod'が削除され、' List_Head'が指すメモリも削除されます。 – azf

答えて

3

作成するNodのスコープと有効期間は、ローカル/自動オブジェクトなので、List::List()のコンストラクタに限定されています。

コンストラクタは返したらNodが存在せず、それ(List_Head)を指しているものは、それが未定義の動作、最も可能性の高いクラッシュを引き起こすdeferencing、ダングリングポインタです。

Nodeは、コンストラクタ本体を超えて参照する場合は、newを呼び出すことによって動的メモリ(ヒープ)に作成する必要があります。

List_Head = new Node(num); 

手動メモリー管理する必要がないように、理想的に、あなたはList_Headのために代わりに生のポインタのスマートポインタのいくつかの並べ替えを使用する必要があります。あなたがコールすることはできません場合は、次の

delete List_Head; 

をメモリリークを避けるために、あなたの用法で行われた後。

+0

しかし、ダイナミックメモリ上にノードを作成すると、ポインタになります。 ノード* nod =新しいノード。 私はポインタではなく、Node変数を作成し、それにNUMを挿入します。それ、どうやったら出来るの? – Jjang

+0

@ user1309152:はい、何が間違っていますか?あなたが割り当てられたメモリを指している有効なポインタを持っている限り、すべて安全です。 –

0

そんなことはできません。 Nodは、コンストラクタの末尾(最後の})の範囲外になります。つまり、メモリが無効になり、つまりList_Headが無効なメモリを指していることを意味します。あなたの周りのメモリを保持する場合

は、あなたが

List_Head = new Node(num); 

ちょうどdeletenewに必ず

のように、 newを使用する必要があります!しかし、あなたはこれに注意する必要があります!メモリを削除しないと、メモリがリークする可能性があります。また、メモリを正しく処理しないと、メモリが2つ削除される可能性があります。具体的には、デストラクタ、コピーコンストラクタ、代入演算子も実装して、割り当てたメモリを適切に処理する必要があります。

スマートポインタ(C++ 11を使用している場合はstd::shared_ptrなど)を使用して、削除を処理してメモリをリークしたり、メモリを2回削除したりすることはできません。クラスの動作方法に応じて、コピーコンストラクタと代入演算子を定義しなければならない場合があります(これらのカスタムバージョンを使用しないとdeep copyの代わりにオブジェクトのshallow copyが得られます)。あなたが欲しい)。

+0

ありがとう、私はList_Headを持っていなかったと仮定しよう。どうしたらいいですか? – Jjang

+0

あなたはかなりつまらないです。そのようなクラスに動的にメンバーを追加することはできません。 – Cornstalks