也就是说,如果我不使用复制构造函数,赋值运算符或移动构造函数等。
int* number = new int();
auto ptr1 = std::shared_ptr<int>( number );
auto ptr2 = std::shared_ptr<int>( number );
是否会有两个强引用?
答案 0 :(得分:3)
根据标准,use_count()
在从原始指针构建shared_ptr
之后立即返回1(第20.7.2.2.1 / 5节)。我们可以从中推断出,不,从原始指针构造的两个shared_ptr
对象彼此不“意识到”,即使原始指针是相同的。
答案 1 :(得分:1)
是的,将会有两个强引用,没有所有共享指针的全局记录,它会查看您尝试覆盖的指针是否已被另一个智能指针覆盖。 (你自己做这样的事情并非不可能,但这不是你应该做的事情)
智能指针创建它自己的引用计数器,在你的情况下,会有两个独立的指针跟踪同一个指针。
因此,智能指针可能会删除内容而不会意识到它也被保存在另一个智能指针中。
答案 2 :(得分:0)
您的代码要求崩溃!
你不能有两个智能指针指向同一个实际对象,因为当引用计数器变为0时,它们都会尝试调用它的析构函数并释放内存。
所以,如果你想让两个智能指针指向同一个对象,你必须这样做:
auto ptr1 = make_shared<int>(10);
auto ptr2 = ptr1;