【发布时间】:2014-10-04 23:54:52
【问题描述】:
从cppreference得知std::shared_ptr有一个构造函数:
template< class Y > explicit shared_ptr( Y* ptr );
我试了一段代码如下:
#include <string>
#include <memory>
#include <iostream>
int main(void) {
/// block 1
{
std::shared_ptr<std::string> s1(new std::string("good"));
std::shared_ptr<std::string> s2(s1.get()); /// s2
std::cerr << s2.use_count() << std::endl;
}
/// block 2
{
std::shared_ptr<int> i1(new int(1));
std::shared_ptr<int> i2(i1.get()); /// i2
std::cerr << i2.use_count() << std::endl;
}
return 0;
}
它会导致 block 1 的段错误,但不会导致 block 2 的段错误,但 use_count 都是 1。我能想到的区别是 int是原始类型,而std::string 由分配器管理。
看了gcc-4.9的bits/shared_ptr.h,发现这个构造函数有一个后置条件:
use_count() == 1 && get() == __p
问题一:
std::shared_ptr 不应该使用已被另一个智能指针引用的原始指针构造吗?从这个意义上说,使用此构造函数的首选方法如下?
std::shared_ptr<T>(new T(...));
问题2:
标准是否对此构造函数有明确要求,或者此后置条件仅适用于libstdc++?
【问题讨论】:
-
构造函数无法知道原始指针是否来自
std::shared_ptr,因此它拥有所有这些。这在这两种情况下都会导致双重删除,因为两个智能指针拥有同一个指针的所有权。
标签: c++ c++11 memory-management shared-ptr smart-pointers