main()関数の外部で作成されたオブジェクトのアドレスを返す
-
03-07-2019 - |
質問
リンクリストを作成しようとしていますが、関数の終了時にスコープ外になると思われるため、関数内でオブジェクトを作成し、アドレスにポインターを割り当てるのに問題があります。これは本当ですか?そして、もしそうなら、メインの外でオブジェクトを作成し、それを使用する方法はありますか?
解決
new演算子を使用してオブジェクトを作成します。すなわち
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;
}
他のヒント
あなたは正しいです。ローカル変数は、関数ブロックの最後でスコープから外れます。オブジェクトへのポインターを作成し、 new で割り当てる必要があります。リストから削除するときは、オブジェクトを削除することを忘れないでください。
ポインターに伴う面倒やバグに対処したくない場合は、 boost :: shared_ptr 代わりに。
新しい演算子を使用:
void f()
{
CMyObject *p = new CMyObject();
List.AddTail(p); // Or whatever call adds the opbject to the list
}
リストが破棄されたときのオブジェクトの削除に注意してください。
なぜオブジェクト(オブジェクトへのポインタではない)をリストに保存しないのですか?作成者関数はオブジェクトを返します。
ポインタのリストが本当に必要な場合は、特別なポインタリストコンテナ( boost :: ptr_list
)を使用するか、スマートポインタを格納する( boost :: shared_ptr
)を検討してください。関数から戻った後にオブジェクトがスコープから出ないようにするには、演算子newを使用してオブジェクトを動的に割り当てる必要があります。
受け入れられた答えは正しくありません。関数内
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
}
所属していません StackOverflow