「より良いアプローチ」とは「より安全なアプローチ」を意味する場合は、「非所有」のスマートポインタをここに実装しました:https://github.com/duneroadrunner/SaferCPlusPlus。 (恥知らずなプラグ警告が、私は、それはここでは関係だと思う。)だからあなたのコードは次のようになります。
#include "mseregistered.h"
...
class foo{
public:
mse::TRegisteredPointer<bar> pntr;
};
int main(){
mse::TRegisteredObj<bar> a;
foo b;
b.pntr=&a;
}
TRegisteredPointerは、目標が破壊されますときに知っていることで生のポインタより「賢く」です。たとえば、
int main(){
foo b;
bar c;
{
mse::TRegisteredObj<bar> a;
b.pntr = &a;
c = *(b.pntr);
}
try {
c = *(b.pntr);
} catch(...) {
// b.pntr "knows" that the object it was pointing to has been deleted so it throws an exception.
};
}
一般に、TRegisteredPointerは、std :: shared_ptrと比べてパフォーマンスが低下します。スタック上にターゲットオブジェクトを割り当てる機会があるときはずっと低くなります。それでもかなり新しく、まだよく書かれていませんが、ライブラリの使用例がコメント付きで含まれています(ファイル "msetl_example.cpp"、下半分)。
ライブラリにはTRegisteredPointerForLegacyも用意されています。これは、TRegisteredPointerよりもやや低速ですが、ほとんどの状況でローポインタの代替として使用できます。 (特にターゲットタイプが完全に定義される前に使用することができますが、TRegisteredPointerではそうではありません)
質問の感想の点では、私はそれが有効だと思います。今やC++プログラマは、少なくとも無効なメモリアクセスの不必要なリスクを回避するオプションを持つべきです。生のポインタも有効なオプションにすることができますが、私はそれがコンテキストに依存すると思います。セキュリティがパフォーマンスよりも重要な複雑なソフトウェアの場合は、より安全な方法が良いかもしれません。
あなたは本当にとリンクする必要があります[最新のリビジョン(N4282)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4282.pdf)、または[ ' std :: experimental :: observer_ptr'](http://en.cppreference.com/w/cpp/experimental/observer_ptr)を参照してください。また、 'reference_wrapper'はポインタが決してnullでない場合のオプションです。 –
@ T.C。ありがとう、終わった。 – vsoftco
@ T.C。 Btw、 ''を持つ実装を知っていますか?私はg ++ 5.3とclang ++ 3.7を試していますが、ヘッダーは実装されていません。 –
vsoftco