同じポインターを 2 つの異なる に送信するshared_ptr
のは良くありません。次のように二重の割り当て解除が発生します。
int* p = new int;
std::shared_ptr<int> p1(p);
std::shared_ptr<int> p2(p); // BAD
次の方法で同じ目的を達成できますstd::enable_shared_from_this
。
class Good: public std::enable_shared_from_this<Good>
{
public:
std::shared_ptr<Good> getptr() {
return shared_from_this();
}
};
int main()
{
std::shared_ptr<Good> gp1(new Good);
std::shared_ptr<Good> gp2 = gp1->getptr();
}
しかし、それでも次のことを防ぐことはできません。
class Good: public std::enable_shared_from_this<Good>
{
public:
std::shared_ptr<Good> getptr() {
return shared_from_this();
}
};
int main()
{
Good* p = new Good;
std::shared_ptr<Good> gp3(p);
std::shared_ptr<Good> gp4(p); // BAD
}
次のようなコードがある場合、これは問題になる可能性があります。
void Function(std::shared_ptr<Good> p)
{
std::cout << p.use_count() << '\n';
}
int main()
{
Good* p = new Good;
std::shared_ptr<Good> p1(p);
Function(p); // BAD
}
スマート ポインターがあるのに、なぜ通常のポインターを使用するのでしょうか。パフォーマンスが重要なコード (または便宜上) では、shared_ptr または weak_ptr のオーバーヘッドが望ましくないためです。
この間違いを防ぐために、次のことを行いました。
class CResource : public shared_ptr<Good>
{
public:
CResource()
{
}
CResource(std::shared_ptr<CBaseControl> c)
: CResource(c)
{
}
private:
CResource(CBaseControl* p)
{
}
};
void Function(CResource p)
{
std::cout << p.use_count() << '\n';
}
int main()
{
Good* p = new Good;
CResource p1(std::shared_ptr<Good>(p));
Function(p); // Error
}
これにより、誰かFunction
がshared_ptr
. ただし、誰かが宣言することを妨げるものではありませんが、それはありvoid Function(std::shared_ptr p)
そうもないと思います。
これでもダメですか?これを行うより良い方法はありますか?