我想使用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()
{
}
唯一的是,如果我做= -1;它会编译并给我一个空指针,这应该不是问题,因为通常你不能为指针分配一个整数值。
所以我的问题是,这是实现这个的正确方法还是我忘记了可能导致应用程序崩溃的情况?因为我看到的每一个地方,我看到为shared_ptr获取nullpointer的唯一方法是调用默认构造函数,与以下代码相比,代码不是很优雅:ptr = 0;。
答案 0 :(得分:25)
没有。 不要改变消息来源。这就是出于某种原因,非常聪明的人已经决定它的定义方式比你要编辑它的方式要好。
你所拥有的甚至没有意义。你不能给指针赋一个整数,它们是两种不同的类型,但你已经给它这样的语义。你说:“......这不应该是一个问题,因为通常你不能给指针分配一个整数值”,但你也在问题的顶部说“我想像我一样使用shared_ptr使用实际指针“。嗯,这是什么?因为将整数分配给指针以将它们设置为null,所以尽可能远离实际指针。
你需要退后一步,意识到你想要的并不总是最好的事情。您应该还原这些更改并正确使用该类。我不想是卑鄙的,但这不是你想去的路线;它是危险的,具有荒谬的语义,并且几乎无法维护。
答案 1 :(得分:9)
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);
}