4

「The C++ Standard Library Extensions」の問題があります。

練習問題 6
セクション 2.4.2 で、同じポインターから 2 つの shared_ptr オブジェクトを作成してはならないと言いました。危険なのは、shared_ptr オブジェクトまたはその子孫の両方が最終的にリソースを削除しようとすることであり、通常はこれが問題を引き起こします。実際、気をつけていれば、これを行うことができます。特に便利ではありませんが、同じポインターから 2 つの shared_ptr オブジェクトを作成し、リソースを 1 回だけ削除するプログラムを作成してください。

以下は私の答えです:

template <typename T>
void nonsence(T*){}
struct SX {
     int data;
     SX(int i = 0) :
              data(i) {
              cout << "SX" << endl;
     }
     ~SX() {
              cout << "~SX" << endl;
     }
};
int main(int argc, char **argv) {
    SX* psx=new SX;
    shared_ptr<SX> sp1(psx),sp2(psx,nonsence<SX>);
    cout<<sp1.use_count()<<endl;
    return 0;
}

しかし、それは良い解決策だとは思いません-コンストラクターを使用して解決したくないからです。誰かが私にもっと良いものをくれますか? thx、私の悪い英語を許してください。

4

4 に答える 4

3

shared_ptr最初の から2 番目を構築するだけですshared_ptr

shared_ptr<SX> sp1( new SX );
shared_ptr<SX> sp2( sp1 );

作成された SX は、SX へのすべての共有ポインタが破棄された場合にのみ、適切に削除されます。

于 2009-05-17T20:58:58.190 に答える
2

あなたが見つけたトリックは有効ですが、役に立ちません。の中心的な機能shared_ptrは参照カウントですが、ここではこれを覆します。deleter (コンストラクターの 2 番目の引数) はshared_ptr、プレーン ポインター以外のリソースで使用するためにあります。次のようなファイルで使用できます。


typedef boost::shared_ptr FilePtr;
void FileClose( FILE* pf ) { if ( pf ) fclose( pf ); }
FilePtr pfile( fopen( "filename" ), FileClose );

データベース接続、ソケットなど、および一般的なRAIIと同じです。

于 2009-05-16T03:54:29.710 に答える
1

ブーストがshared_from_thisでどのように解決するかを確認できます。コードは次のとおりです。

于 2009-05-16T03:09:00.863 に答える
0

ブーストドキュメントから「標準」の回答を得ました: http://www.boost.org/doc/libs/1%5F38%5F0/libs/smart%5Fptr/sp%5Ftechniques.html#another_sp

于 2009-05-22T06:56:21.727 に答える