我写了一些简单的代码来帮助我理解智能指针:
string s = "str";
vector <unique_ptr<string>> pv ;
pv.push_back(unique_ptr<string>(&s));
cout<<*(pv[0])<<endl;
这段代码编译得很好,但是得到一个运行时错误:
str*错误在'…': munmap_chunk():无效指针:0x00007ffd956e57e0 * Aborted (core dumps)
发生了什么,我做错了什么?
在std::unique_ptr
的析构函数中,它将在&s
指针上调用delete
,该指针不是通过new
分配的。
只使用:
std::vector<std::string> vector;
vector.emplace_back("str");
std::cout << pv[0] << std::endl;
这里不需要std::unique_ptr<std::string>
您的字符串将被销毁两次-一次是当您的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...
或者,更简单、更安全:
pv.push_back(std::make_unique<std::string>("str")); // make_unique is 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.