2009-03-03 10 views
0

リンクリストを作成しようとしていますが、関数内でオブジェクトを作成してポインタにアドレスを割り当てるのに問題があります。関数は終了します。これは本当ですか?もしそうなら、どうすればメイン以外のオブジェクトを作成し、それを使用することができますか?main()関数の外部で作成されたオブジェクトのアドレスを返す

+0

はあなたにもいくつかのコードを投稿することができますか? – dirkgently

答えて

0

新しい演算子でオブジェクトを作成します。 ie

void foo(myObject* bar1, myObject* bar2) 
{ 
    bar1 = new myObject(); 
    bar2 = new myObject(); 
    // do something 
} 

int main(int argc, char* argv[]) 
{ 
    myObject* thing1; 
    myObject* thing2; 
    foo(thing1, thing2); 

    // Don't forget to release the memory! 
    delete thing1; 
    delete thing2; 

    return 0; 
} 
+0

新しいbar1とbar2ポインタが作成されましたが、main()からポインタにアクセスできますか? – chustar

+0

bar1とbar2は関数のパラメータです。したがって、2つの新しい操作で割り当てられたメモリは、2つの関数を渡されたポインタによって2つ指し示されます。 fooが呼び出された後、thing1とthing2はARE bar1とbar2のため正確に同じメモリを指します。希望が役立ちます。 – cpatrick

3

正しいですが、ローカル変数は関数ブロックの最後にスコープから外れます。オブジェクトへのポインタを作成し、newでそれらを割り当てる必要があります。そして、あなたがあなたのリストからそれを削除するとき、オブジェクトを削除することを忘れないでください。

ポインタに付随する手間とバグに対処したくない場合は、代わりにboost::shared_ptrを参照してください。あなたのリストが破棄されると削除をobjectに

void f() 
{ 
    CMyObject *p = new CMyObject(); 
    List.AddTail(p); // Or whatever call adds the opbject to the list 
} 

ご注意:

+0

+1ブーストアドボカシー... :) – mwigdahl

+0

彼は言語に新しいようです。私の推測では、彼は学校の割り当てのためのリンクされたリストを実装している(そうでなければ彼はSTLまたはそのようなものを使うだろう)。彼はおそらく、第三者の図書館を使ってはならないのではないでしょうか。もちろん、これはちょうど推測です... –

+0

@ 2-bits。それは本当です。 – chustar

2

は、new演算子を使用します。

0

リストにオブジェクトを(オブジェクトへのポインタではなく)保存しないのはなぜですか?作成者関数はオブジェクトを返します。

ポインタのリストが本当に必要な場合は、特別なポインタリストコンテナ(boost::ptr_list)を使用するか、スマートポインタを格納することを検討してください(boost::shared_ptr)。関数から返ってオブジェクトがスコープから外れるのを防ぐには、それらをnew演算子で動的に割り当てる必要があります。

0

受け入れられる回答は正しくありません。関数内で

void foo(myObject* bar1, myObject* bar2) 
{ 
    bar1 = new myObject(); 
    bar2 = new myObject(); 
    // do something 
} 

新しく割り当てられたオブジェクトはローカル変数に割り当てられます。呼び出し関数内のポインタの値には影響しません。あなたが必要なもの

int main(int argc, char* argv[]) 
{ 
    myObject* thing1; 
    myObject* thing2; 
    foo(thing1, thing2); // thing1 and thing2 don't get assigned 
         // They continue to be uninitialized in 
         // this function 

    // Don't forget to release the memory! 
    delete thing1; // These two deletes will lead to undefined behavior. 
    delete thing2; 

    return 0; 
} 

は次のとおりです。

void foo(myObject*& bar1, myObject*& bar2) 
{ 
    bar1 = new myObject(); // Now the value of the pointers in the calling 
    bar2 = new myObject(); // will be changed since the pointers are passed by reference. 
    // do something 
} 
関連する問題