为什么字符串向量的unique_ptr的push_back失败
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;
}
在这种情况下,我在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;
}
相关文章:
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- C++自己的对象堆栈.在 push() 上复制了什么?
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- 如何像在javascript中一样"push" c ++映射
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- std::vector using back(), pop_back(), push_back(), 得到'double free or corruption'错误
- vector.back()和vector.end()有什么区别
- 列表大小为 1,但 front() 和 back() 不相等
- 返回C++中没有 back() 方法的容器的最后一个元素?
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 模板堆栈类的复制构造函数中的 pop() 和 push() 不起作用
- 我们可以使用Back() - 值索引在其上执行向量插入
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- push(ing)back在循环中对象指针
- 在 C++ 中将元素添加到空向量:为什么 push.back 有效而 [] 无效
- 我似乎无法让 v.push.back() 处理字符串
- String::push_back() does not push back
- 向量resize(), push.back(), reserve()方法