C++11 为什么std::unique_ptr向量获取无效指针异常

C++11 为什么std::unique_ptr向量获取无效指针异常,c++11,vector,runtime-error,smart-pointers,unique-ptr,C++11,Vector,Runtime Error,Smart Pointers,Unique Ptr,我编写了简单的代码来帮助我理解智能指针: string s = "str"; vector <unique_ptr<string>> pv ; pv.push_back(unique_ptr<string>(&s)); cout<<*(pv[0])<<endl; string s=“str”; 向量pv; pv.push_-back(独特的ptr&s)); cout在std::unique_ptr的析构函数中,它将在&s指针

我编写了简单的代码来帮助我理解智能指针:

string s = "str";
vector <unique_ptr<string>> pv ;

pv.push_back(unique_ptr<string>(&s));
cout<<*(pv[0])<<endl;
string s=“str”;
向量pv;
pv.push_-back(独特的ptr&s));

cout在
std::unique_ptr
的析构函数中,它将在
&s
指针上调用
delete
,该指针未通过
new
分配

只需使用:

std::vector<std::string> vector;
vector.emplace_back("str");
std::cout << pv[0] << std::endl;
std::vector;
向量。安置回(“str”);

std::cout您的字符串将被销毁两次—一次是当您的
pv
超出范围并被删除时,释放其包含的所有
unique_ptr
元素,一次是当
s
超出范围时

要使用唯一指针的向量(或通常使用唯一指针),它们必须没有别名。所以你可以写:

auto *s = new std::string("str");
pv.push_back(std::unique_ptr<std::string>(s));
// do not write "delete s" anywhere...
auto*s=newstd::string(“str”);
pv.push_-back(标准::唯一的ptr);
//不要在任何地方写“删除s”。。。
或者,更简单、更安全:

pv.push_back(std::make_unique<std::string>("str")); // make_unique is C++14
pv.push_-back(std::make_-unique(“str”);//使_唯一是C++14
甚至:

std::unique_ptr<std::string> p{new std::string("str")};
pv.push_back(std::move(p));
// Do not attempt to use p beyond this point.
std::unique_ptr p{newstd::string(“str”)};
pv.推回(标准::移动(p));
//不要试图使用超过此点的p。

A
unique\u ptr
对堆栈上的某些内容没有意义。