2011-01-15 7 views
1

誰かがこのニーズを満たすようなものを実行しているのだろうかと思います。存在するかどうか:1つのオブジェクトが所有するスマートポインタがアクセスを許可する

オブジェクトAにはオブジェクトBが含まれています。ポインタを使用してそのBへのアクセスをクライアントに提供したい場合があります(0かもしれない、またはクライアントがコピー可能である必要があり、 )。クライアントは、オブジェクトCと呼ぶことができます。通常、完全な開発者であれば、Bのポインターの生涯セマンティクスに違反しないように注意深く書かれていますが、実際には完璧ではありません。半分の時間はかなりかわいそうだ。

私たちが望むのは、オブジェクトCが "共有"所有権ではなく、オブジェクトAが有効でない状況を認識するのに十分スマートなオブジェクトBへのポインタを持つことです。破壊されたり、オブジェクトBが破壊されたりします。このポインタがもはや有効でないときにアクセスすると、アサーション/例外/何でも発生します。

つまり、私は安全かつ明確な方法でデータへのアクセスを共有したいが、元の所有権セマンティクスは保持したい。現在、オブジェクトの1つが所有している共有ポインタを見つけることができなかったので、私はshared_ptrをそのようなことの代わりに使用していました。しかし、私は明確なオーナーシップと共有/弱いポインタが本当にそれを提供しないことを望む。

このスマートポインタを動的に割り当てられたメモリ領域へのポインタを保持するのではなく、メンバ変数にアタッチすることができればさらに便利です。

もし存在しなければ、私はそれを作るつもりです。だから、誰かがすでにそこに何かをリリースしているかどうかを最初に知りたいのです。

そして、私は参考文献やポインタのようなものがこの種のものを提供していることを認識しています...もっとスマートなものを探しています。

+0

まあ、誰も足を伸ばして1つを指しているので、私はそれがそこにないと仮定しています。ちょうど見るためにLoki図書館をチェックするかもしれない。これまでの回答はOKで、おそらくweak_ptrの使い方を知らない人にとっては役に立ちますが、私は実際にこの目的のために特別に設計されたものを探しています。 –

答えて

1

boost::weak_ptrはあなたが探しているものです。たぶん、いくつかの小さな微調整で、それからのshared_ptrの作成を禁止するように。また、これは、動的に割り当てられていないメモリへのポインタを含む何かを保持することができます。

+1

'shared_ptr'の作成が許可されていない' boost :: weak_ptr'は、かなり役に立たず、 'shared_ptr'に変換する以外の方法はありません。 – jpalecek

+0

weak_ptrからのshared_ptrの作成を禁止すると、非常に限られた使用のように思えますし、あなたに 'bad_weak_ptr'例外がスローされるように頼んでいるだけです。 –

+0

weak_ptrはshared_ptrシステムの一部です。私は使用しているシステムのセマンティクスを壊さないようにしています。 –

0

あなたが望むセマンティクスは、QtのQPointerに似ています。対応するQObjectが削除されている場合(通常は、例えばoperator delete)、これはQObjectを保持できるポインタであり、NULL自体です。

しかし、同様のアプローチには固有の問題があります。つまり、クライアントは、ぶら下がりポインタを使用していないことを確認できません。例えば。

QPointer<T> smart_ptr = original_obj; 
T* tmp = smart_ptr; // this might be a function argument etc. 

... // later 
delete original_obj; 

... // even later 
tmp->do_something(); // CRASH 

これはやるまさにshared_ptr/weak_ptrあるオブジェクトの削除を許可していないいくつかの「ハード」の参照を使用して回避することができます。

BTW、AFAIK、shared_ptrはメンバ変数を指すことができますが、メンバ変数を管理することはできません。つまり、何もしないカスタムのDeleterを提供する必要があります。

+0

ええ、私はshared_ptr(ptr、null_op)トリックを使用しました。システムのセマンティクスに違反しないものを探してください。 null_opトリックは実際にはshared_ptrの全体を完全に分解します。スマートポインタはまったくないかもしれません。 –

+0

@ノア・ロバーツ:私はそれがすべてを分解するとは思っていません - あなたは単にshared_ptrを取得します。これは、ライブラリが必要な場合に便利です。しかし、これは 'shared_ptr'の使用を意図していません。選択する必要があります - あなたは削除の世話をするか(これはメンバ変数には常に当てはまります) - クライアントはこれを考慮する必要があります。生涯のセマンティクスに違反していません_。または、オブジェクトの存続期間を駆動する参照です。この場合、メンバ変数にすることはできません。これは、参照の持続時間を保証できないためです。またはガベージコレクタを使用します。他の方法はありません。 – jpalecek

+0

です。あなたは本当のshared_ptrを取得していません。もちろん、shared_ptrに付随するすべての余分なものを手に入れることができます。実際にはshared_ptrは完全に余計で、shared_ptrには何も影響がありません。これが、私が正しいことをする何かを探している理由です。とにかくおかげで。私はそれを書く時のために私のブログをチェックし続ける:p –

関連する問題