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