shared_ptr空指针和赋值

shared_ptr null pointer and assignment

本文关键字:赋值 空指针 ptr shared      更新时间:2023-10-16

我想使用shared_ptr就像使用实际指针一样。我希望能够做这样的事情

shared_ptr<int> a;
a = new int(5);
a = 0;
shared_ptr<int> foo()
    return 0;

但默认情况下不实现。

我shared_ptr通过添加

template<class Y> void operator=( int i )
{
    reset(i);
}
template<class Y> void reset(int i)
{
    this_type(i).swap(*this);
}
template<class Y> void operator=( Y * p )
{
    reset(p);
}
shared_ptr(int i): px(0), pn()
{
}

唯一的问题是,如果我做一个 = -1;它会编译并给我一个空指针,这应该不是问题,因为通常你不能为指针分配整数值。

所以我的问题是,这是实现这一点的正确方法,还是我忘记了可能导致应用程序崩溃的情况?因为无论我在哪里看,我看到的获取shared_ptr的 nullpointer 的唯一方法是调用默认构造函数,与 ptr = 0; 相比,它在代码中不是很优雅。

No.不要更改源。这样做是有原因的,非常聪明的人已经决定它的定义方式比你要编辑它的方式更好。

你所拥有的甚至没有意义。你不能为指针赋值一个整数,它们是两种不同的类型,但你已经给了它这样的语义。你说:"...这应该不是问题,因为通常你不能为指针分配整数值",但你在问题的顶部也说"我想使用shared_ptr就像我使用实际指针一样"。嗯,是哪个?因为将整数分配给指针以将它们设置为 null 与实际指针的距离尽可能远。

你需要退后一步,意识到你想要的并不总是最好的事情。您应该还原这些更改并正确使用该类。我不想刻薄,但这真的不是你想走的路;它很危险,有荒谬的语义,而且到处都是不可维护的。

shared_ptr实现了一个类似指针的接口,因此您可以使用*->运算符。

默认构造的(空)shared_ptr在内部等于 nullptr,因此您无需担心显式分配它。 即

std::shared_ptr<int> sh;
std::cout << ( sh.get() == nullptr ) << std::endl;
// Or alternatively:
std::cout << ( sh == nullptr ) << std::endl;

此外,(在我看来)使用shared_ptr创建对象的最优雅方法是std::make_shared函数。 这还有一个额外的好处,即在某些编译器中(至少在MSVC++上)效率略高,因为一些内部优化被称为"我们知道你住在哪里"的习惯用语。

#include <memory>
#include <string>
class foo
{
public:
    foo(std::string s, int n) {}
};
int main()
{
    auto p = std::make_shared<int>();
    auto q = std::make_shared<foo>("hello", 2);
}