我编写了简单的代码来帮助我理解智能指针:
string s = "str";
vector <unique_ptr<string>> pv ;
pv.push_back(unique_ptr<string>(&s));
cout<<*(pv[0])<<endl;
这段代码编译得很好,但是我遇到了运行时错误:
STR *错误`...&#39;:munmap_chunk():无效指针:0x00007ffd956e57e0 * 已中止(核心转储)
发生了什么事,我做错了什么?
答案 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.