6

私はこのように見えた機能を実装する必要がありました。 MyListクラスは、next変数へのポインタを持つノードを持ち、リスト内のオブジェクトはユーザー定義でした。オブジェクトのリストを実装するときに動的割り当てを処理する方法は?関数は、2個のリストを取り、新しいリストに各オブジェクトの合計を置い</p> <pre><code>MyList * sum (MyList * l1, MyList * l2) { MyList * newlist = new MyList(); //Adds two objects and place the result in a third new list return newlist; } </code></pre> <p>:

それで、私はオブジェクトとリスト自体からのメモリの動的割り当てをどのように扱うべきですか?新しいリストのオブジェクトごとにメモリを作成しなければならなかったからです。

ダイナミックアロケーションに頼ることなく、オブジェクトの合計の値を新しいリストに配置する方法はありますか?これに代えて

Object result(node1->content + node2->content); 
Node->content = &result; // will this object be erased when the function ends? 

Node->content = new Object(node1->content + node2->content); 

はどのようにして保持する変数に関連して、関数の内部で作成された新しいリストの寿命に対処すべきであるかもしれないこのような何かを実行して、関数の終了後のメモリ?新しいリストを返すときに、このようなことをすることはできますか?短いで

MyList & sum (MyList * l1, MyList * l2) { 
    //Create variable without allocating memory and return it's reference 
} 

、私の主な疑問は、関数の内部で作成され、他のオブジェクトが保持されるオブジェクトの寿命に対処する方法です。

+7

あなたは 'std :: shared_ptr' /' std :: unique_ptr'を考えましたか? –

+6

'std :: list'を使います。 'std :: list'は自動的にメモリを管理します。 –

+0

Uhh、なぜ誰かがその関数の署名を主張するでしょう... – HolyBlackCat

答えて

0
Object result(node1->content + node2->content); 
Node->content = &result; // will this object be erased when the function ends? 

resultは、上に示した構文で、関数本体内に作成される場合、関数が終了するとはい、それは破壊されます。

これは、あなたがnewと動的割り当てを使用する必要がある理由です。このように、あなたのオブジェクトは、(代わりに、ローカル関数のスタックの)ヒープ上で作成されている、と彼らは関数の最後を「生き残ります」それらは作成されます。また、返されたポインタを呼び出し元に渡すことができます。もちろん、呼び出し側は返されたポインタを正しくdeleteしなければなりません。そうしないと、メモリ(または他のリソース)のリークが発生します。現代のC++では

、あなたはstd::shared_ptrまたはstd::unique_ptrのように、既に定義されているスマートポインタにクラスを使用する必要があり、あなたはいくつかのカスタム高度に最適化されたデータ構造を開発していない限り、あなたのコードは、(明示newdeleteを使用することはほとんどないはずですこの場合でも、newdeleteを呼び出す明示的なコードはRAIIクラスの境界内で安全にラップする必要があります)。

しかし、あなたのコードはプログラミング練習に似ているようですが、おそらくこの演習の目的は、明示的にnewdeleteで動的メモリ割り当てを学習することです。実際、生産品質のコードでは、独自のリストクラスをロールするのではなく、std::listのような既に使用可能な標準リンクリストクラステンプレートを使用できます。

2
Node->content = &result; // will this object be erased when the function ends? 

はい、ローカル変数です。機能が終了するとすぐにresultの有効期間が終了します。


MyList & sum (MyList * l1, MyList * l2) { 
    //Create variable without allocating memory and return it's reference 
} 

これは、上記と同様の理由で、あまりにも失敗します。


私はあなたがstd::shared_ptrstd::unique_ptrを使用することをお勧め。ご希望の場合は、Differences between unique_ptr and shared_ptrとお読みください。

関連する問題