4

私はC++を学んでいます。私はC、C#、ObjCのバックグラウンドを持っています。かなり高級言語。

C#またはObjCでは、関数またはメソッドの結果としてヒープに割り当てられたオブジェクトを返すのは簡単です。オブジェクトのクリーンアップは(慣例により)管理されているためです。適切なタイミングで破壊されます。

しかし、C++でこれをどのように処理すればよいかわかりません。

例えば、

std::string* makeString()
{
    std::string* str = GetSomeStringFromArbitrarySource ();
    SaveSomewhereElseInternally (str);
    return str;
}
void useString ()
{
    std::string* str = makeString ();

    // Where and how should I cleanup the `str` object?
    // It is not safe `delete str` here because it may be used on another place.
}

多くの関数に渡されるときにヒープに割り当てられたオブジェクトをクリーンアップするための推奨される従来の方法は何ですか?

私はいくつかのスマートポインターを見ましたが、それらは実際には複雑さや気になることを減らすようには見えません。スマートポインタを誤解していますか?

4

5 に答える 5

3

私はいくつかのスマートポインターを見ましたが、それらは実際には複雑さや気になることを減らすようには見えません。スマートポインタを誤解していますか?

おそらくそうです。C ++では、これを自分で処理する必要があるため(GCがクリーンアップすることはありません)、すべてのオブジェクトの使用状況を追跡する方法が必要です。

newすべてを手動で一致させることができますがdelete、上記のシナリオのように、これは困難または不可能な場合があります。オブジェクトが他の場所で使用されているかどうかを知る方法はありません。

スマートポインタは、存続期間を管理することでこれを解決するため、削除する必要はありません。さまざまなメカニズムを使用して、オブジェクトが使用されている場所の数を追跡しdelete、最後の場所が完了したときに呼び出します。

そうは言っても、この特定のケースでは、ポインタを使用する理由はほとんどありません。を使用している場合はstd::string、文字列を値で渡すことができ、問題になることはありません。

于 2013-02-28T01:49:51.423 に答える
2

オブジェクトの望ましい存続期間を把握してから、型システムを使用してその存続期間を適用する必要があります。

あなたの例から、いつオブジェクトを破壊したいかはまったく明確ではありません。

C ++では、オブジェクトが値で渡されるのが一般的です(プリミティブ型はJava / C#などにあるため)。したがって、std::string異なるコード間で共有する必要がない限り、通常は次のようになります。値による文字列(makeStringとして記述std::string makeString())。

同じオブジェクトを参照する複数の場所が必要な場合は、設計について慎重に検討し、プログラムのどの部分がオブジェクトの存続期間を安全に制御できるかを決定する必要があります。その場所に値でオブジェクトを作成してから、ポインタと参照を他の場所に渡します。

于 2013-02-28T01:50:22.517 に答える
2

あなたはおそらくあなたが書いたのと同じ理由でスマートポインタを誤解しています:

std::string* makeString()

ほとんどのC++プログラマーが代わりに書くものの代わりに:

std::string makeString()

C ++でのオブジェクトの有効期間をよりよく理解する必要があります。そうすれば、スマートポインターの概念がはるかに簡単になります。

于 2013-02-28T02:01:21.910 に答える
1

おそらくあなたはスマートポインタを誤解しています。C ++の代替手段は、プログラマーが動的に割り当てられたオブジェクトの存続期間と使用状況を追跡する必要があることです。これはソフトウェアの設計に影響を与え、人為的エラーが忍び寄る原因にもなります。スマートポインターを使用する場合、オブジェクトの存続期間はほとんど処理されます。

私はC++の古典的なスタイル(スマートポインターなし)で育ったので、必要に応じてそのようにプログラムすることができますが、C ++から始める場合は、スマートポインターは本当に必須です。

于 2013-02-28T02:00:29.847 に答える
0

C ++ 11を使用できる場合は、共有ポインターを使用してください。これらのポインタは、最後のポインタが破棄されると、割り当てられたオブジェクトを削除するメカニズムを実装します。C ++ 03を使用している場合は、boostの 共有ポインタを使用してください。どちらも使用できない場合は、スタックに割り当てるクラスでヒープ割り当てをラップしてから、それらへの参照を渡し、RAIIwikiに読み取りを与えてください。

于 2013-02-28T01:51:08.843 に答える