为什么std::unique_ptr vector得到无效指针异常



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

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.

相关内容

  • 没有找到相关文章

最新更新