4

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

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

但默认情况下未实现。

我通过添加更改了 boost 库的 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()
{
}

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

所以我的问题是,这是实现此功能的正确方法还是我忘记了可能使应用程序崩溃的情况?因为在我所见的任何地方,我看到为 shared_ptr 获取空指针的唯一方法是调用默认构造函数,与 ptr = 0; 相比,该构造函数在代码中不是很优雅。

4

2 回答 2

26

,不要更改来源。出于某种原因,非常聪明的人已经决定它的定义方式比你将要编辑的方式更好。

你所拥有的甚至没有意义。您不能将整数分配给指针,它们是两种不同的类型,但您已经赋予它这样的语义。你说:“......这不应该是一个问题,因为通常你不能为指针分配一个整数值”,但你还在问题的顶部说“我想像我一样使用 shared_ptr使用实际的指针”。好吧,它是什么?因为将整数分配给指针以将它们设置为 null 与您可以获得的实际指针差不多。

你需要退后一步,意识到你想要的并不总是最好的。您应该恢复这些更改并正确使用该类。我不想刻薄,但这真的不是你想走的路;它很危险,具有荒谬的语义,并且几乎无法维护。

于 2012-04-22T08:14:17.380 回答
10

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

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

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);
}
于 2012-04-22T08:15:01.470 回答