2016-05-27 5 views
1

私の問題は、指定されたアドレスに新しいオブジェクトを作成したいということです。C++メソッドで新しいオブジェクトを作成

MethodA() 
{ 
    TreeNode* nodeResult = NULL; 
    initObject(nodeResult); 
    //nodeResult is NULL anyway 
} 
void initObject(TreeNode* obj) 
{ 
    if(obj == NULL) 
    { 
     obj = new TreeNode(); 
    } 
} 

新しいオブジェクトがinitObject方法のブラケットの最後に作成されますが、削除されたように思えます。

+2

が正解だ、それは、オブジェクトがあなたのコード内で削除されていないことは注目に値します、あなたはそれへのポインタを失ってしまいました。オブジェクトを作るためにC++で 'new'を呼び出すと、ポインタに' delete'を呼び出すまでは削除されません。最近のコンベンションでは、 'std :: shared_ptr'と' std :: unique_ptr'を利用して、できるだけ手動でこれを行う必要がなくなりました。それらとそれらの背後にあるメモリ管理/所有権の概念を読んでください。 –

+0

@ MatthewWaltonのコメントは答えの1つに追加する必要があります。 –

+0

ポインタについて特別なことは何もありません。あなたが 'void initNumber(int x){if(x == 0)x = 42; } void f(){int x = 0; initNumber(x); } '、あなたは何が起こるかを理解するでしょう。 – molbdnilo

答えて

5

あなたが参照を使用する必要がポインタが値型

MethodA() 
{ 
    TreeNode* nodeResult = NULL; 
    initObject(nodeResult); 
    //nodeResult is NULL anyway 
} 
void initObject(TreeNode* & obj) 
{ 
    if(obj == NULL) 
    { 
     obj = new TreeNode(); 
    } 
} 
6

ですので、あなたのinitObject方法は、呼び出し側の変数を変更したいので、これは失敗しますが、あなたはそれのコピーを渡しています。 initObject機能呼び出し側の変数へ参照を与える

void initObject(TreeNode* &obj) 
{ 
    if(obj == NULL) 
    { 
     obj = new TreeNode(); 
    } 
} 

これ、およびそれへの割り当ては、関数が戻った後、呼び出し元に表示されます:に変更します。

1

ポインタの意味を理解する必要があります。

ポインタは、メモリブロックのアドレスを格納する変数です。ポインタをコピーするだけでアドレスがコピーされます。ここで

obj = new TreeNode(); 

あなたは、objに新しいTreeNodeのアドレスを新しい値を与えるが、それはそれです。あなたはあなたの機能からそれを返すことはありません。引数TreeNode* objnodeResultの変数コピーであり、アドレスを格納するだけなので、nodeResult自体は変更されません。

あなたはこのようにように、二重のポインタまたはreferenceを使用して、あなたの問題を解決することができます:

void initObject(TreeNode*& obj) 
{ 
    if(obj == NULL) 
    { 
     obj = new TreeNode(); 
    } 
} 

を次に何initObjectに渡されたのは、nodeResultのコピーが、変数自体への参照ではありません作りますそれは変更可能です。

1
TreeNode* nodeResult = NULL; 

メモリアドレスを含む変数です。

initObject(nodeResult);に電話すると、その時点でそのポインタの内容がNULLになります。関数呼び出しの後で変数を有効な値にした後、ポインタを自分自身に渡す必要があります。 TreeNode*の代わりにintがあった場合は&または*としてintを渡します。同様に:@ pw94に加えて

void initObject(TreeNode*& obj) // see it as int& 
{ 
    if(obj == NULL) 
    { 
     obj = new TreeNode(); 
    } 
} 

または

void initObject(TreeNode* * obj) // see it as int* 
{ 
    if(*obj == NULL) 
    { 
     *obj = new TreeNode(); 
    } 
} 
関連する問題