特定のオブジェクトへの参照を取得するメソッドがいくつかあり、一部はboost::shared_ptr
. これまでのテスト メソッドではshared_ptr
、これらのオブジェクトの 1 つを指すように作成*ptr
し、参照を期待するメソッドに渡しました。たとえば、スタック上にローカル オブジェクトを作成し、安全な方法でそのオブジェクトへの共有ポインタを作成して、&obj
従来のポインタを使用した演算子の簡単な代替手段に到達することは可能ですか?
5 に答える
これが必要な場合は、コードに何か問題がある可能性があります。
関数が共有ポインターを取る場合、オブジェクトの有効期間を延長する必要があるためです。オブジェクトの有効期間を延長する必要がない場合は、参照を取得する必要があります。
あなたがしていることでは、オブジェクトの寿命を延ばすことはできません。必要があってもできない場合は、渡された共有ポインターのコピーを介してスコープ外になったオブジェクトにアクセスすることになります。ブーム。
これが理にかなっている可能性はわずかです。ライフスパンを延長する必要があるかもしれませんが、延長に必要な可能性がある最長よりも長くオブジェクトが有効であることを確認してください。しかし、これを行わないことを強くお勧めします。これは信じられないほど脆弱であり、呼び出し元のコードの動作に正確に依存するすべてのコードを呼び出します。
#include <boost/shared_ptr.hpp>
void null_deleter(int *)
{}
int main()
{
int i = 0;
boost::shared_ptr<int> p(&i, &null_deleter);
}
フォームのコンストラクターで適切なデリータを渡すことができます。
template<class Y, class D> shared_ptr(Y * p, D d);
deleter オブジェクトは、次の関数のように、その で何も実行してはなりませんoperator()()
:
template <typename T>
void no_op(T*) {}
これを使用して、次を構築できます。
boost::shared_ptr<Foo> f(&obj, no_op<Foo>);
コンストラクターで null_deleter を渡すことができます。
#include <boost/shared_ptr.hpp>
#include <boost/core/null_deleter.hpp>
int main()
{
int a = 0;
boost::shared_ptr<int> pi(&a, boost::null_deleter());
}
しかし、このケースに注意してください: 破壊後にオブジェクトを使用する:
#include <boost/shared_ptr.hpp>
#include <boost/core/null_deleter.hpp>
class Y
{
public:
void tryUse()
{
std::cout << "attempt to use :"<< (uintptr_t)(void*)this<< std::endl;
}
~Y()
{
std::cout << "destructor: "<< (uintptr_t)(void*)this<< std::endl;
}
};
struct Y_user
{
boost::shared_ptr<Y> p;
~Y_user()
{
std::cout << "Y_user destructor: "<< (uintptr_t)(void*)this<< std::endl;
if (p.get())
p->tryUse();
}
};
int main()
{
{
Y_user yu;
Y y;
boost::shared_ptr<Y> p (&y, boost::null_deleter() );
yu.p = p;
}
}
次のようなコンソール出力が表示されます。
destructor: 140737179995232
Y_user destructor: 140737179995264
attempt to use :140737179995232