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

时间:2015-09-02 15:34:05

标签: 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;

这段代码编译得很好,但是我遇到了运行时错误:

  

STR    *错误`...&#39;:munmap_chunk():无效指针:0x00007ffd956e57e0 * 已中止(核心转储)

发生了什么事,我做错了什么?

2 个答案:

答案 0 :(得分:3)

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

只需使用:

std::vector<std::string> vector;
vector.emplace_back("str");
std::cout << pv[0] << std::endl;

那里不需要std::unique_ptr<std::string>

答案 1 :(得分:0)

您的字符串被破坏了两次 - 一次当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.