Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享\u ptr空指针和赋值_C++_Pointers_Null_Shared Ptr - Fatal编程技术网

C++ 共享\u ptr空指针和赋值

C++ 共享\u ptr空指针和赋值,c++,pointers,null,shared-ptr,C++,Pointers,Null,Shared Ptr,我想像使用实际指针一样使用shared_ptr。我想做一些事情,比如 shared_ptr<int> a; a = new int(5); a = 0; shared_ptr<int> foo() return 0; shared\u ptr a; a=新的整数(5); a=0; 共享_ptr foo() 返回0; 但它不是默认实现的 我通过添加 template<class Y> void operator=( int i ) { res

我想像使用实际指针一样使用shared_ptr。我想做一些事情,比如

shared_ptr<int> a;
a = new int(5);
a = 0;
shared_ptr<int> foo()
    return 0;
shared\u ptr a;
a=新的整数(5);
a=0;
共享_ptr foo()
返回0;
但它不是默认实现的

我通过添加

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()
{
}
template void操作符=(int i)
{
重置(i);
}
模板无效重置(int i)
{
此类型(i).掉期(*此);
}
模板无效运算符=(Y*p)
{
复位(p);
}
共享ptr(inti):px(0),pn()
{
}
唯一的问题是如果我做a=-1;它将编译并给我一个空指针,这不应该是一个问题,因为通常您不能为指针分配整数值


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

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

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


你需要后退一步,意识到你想要的并不总是最好的事情。您应该恢复这些更改并正确使用该类。我不想小气,但这不是你想走的路;它很危险,语义不合理,而且无法维护。

shared\u ptr实现了一个类似指针的接口,因此您可以使用
*
->
操作符

默认构造的(空)共享_ptr在内部将等于nullptr,因此您无需担心显式分配它。i、 e

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

// Or alternatively:
std::cout << ( sh == nullptr ) << std::endl;

literal
0
是空指针常量,因此可以隐式转换为任何指针类型的空指针值。+1“我更改了boost库的共享\u ptr的源代码”;)为什么不改用C++11
nullptr
?是的,你说得对。我想我只是太懒了,因为我不想改变一切,因为我以前有一个普通的指针,现在正在改成智能ptr。我怀疑我所做的是错的,这就是为什么我问:)@MichaelFerris:没关系,但有时你必须开始工作,尤其是在重构代码时随着您的编码风格的改进,您会发现最好是明确地描述事情。虽然隐式功能意味着您的工作量减少,但它通常意味着您的清晰度和安全性降低。只需查看
返回0returnboost::shared_ptr()时,不会产生混淆。事实上,新的C++标准只为NULL引入了一个新的关键字:<代码> NulLPTR < /代码>。谢谢!:)此外,我选择在标准库中使用共享的_ptr,这样我就不必携带像boost这样的大型库。还有那么多东西要学;)@迈克尔菲利斯:如果你能使用它,一定要养成习惯。现在所有主流编译器都支持它,而且它非常有用。另外,欢迎来到StackOverflow。
#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);
}