为什么字符串向量的unique_ptr的push_back失败

Why does push_back fail for unique_ptr of string vectors?

本文关键字:push back 失败 ptr unique 字符串 向量 为什么      更新时间:2024-04-28

下面的代码存在分段错误。当没有涉及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;
}