为什么 push_back 对 unique_ptr 个字符串向量失败?

Why does push_back fail for unique_ptr of string vectors?

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

对于这种情况,我在 Ubunutu 上使用 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;
}