下面的代码存在分段错误。当没有涉及unique_ptr时,一切都很好。
#include <iostream>
int main() {
auto vect = std::unique_ptr<std::vector<std::string>>();
vect->push_back("abc"); // Segmentation Fault.
vect->emplace_back("abc"); // Segmentation Fault.
return 0;
}
在这种情况下,我在Ubuntu上使用g++10.2进行编译。
您需要初始化unique_ptr
实例,如下所示:
using type = std::vector<std::string>;
auto vect = std::make_unique<type>();
vect->push_back("abc"); // No segfaults now
vect->emplace_back("abc"); // No segfaults now either
std::cout << vect->at(0) << std::endl;
您已经使用默认构造函数声明了一个std::unique_ptr
,因此它持有一个nullptr
指针。您没有创建std::vector
对象以使其指向。
使用new
创建std::vector
:
int main() {
auto vect = std::unique<std::vector<std::string>>(new std::vector<std::string>);
// or:
// std::unique<std::vector<std::string>> vect(new std::vector<std::string>);
vect->push_back("abc");
vect->emplace_back("abc");
return 0;
}
或者,在C++14及更高版本中,使用std::make_unique()
而不是手动构建std::vector
:
int main() {
auto vect = std::make_unique<std::vector<std::string>>();
vect->push_back("abc");
vect->emplace_back("abc");
return 0;
}
然而,除非你绝对需要,否则你真的不应该在动态内存中创建标准容器
int main() {
std::vector<std::string>> vect;
vect.push_back("abc");
vect.emplace_back("abc");
return 0;
}