使用std::copy复制vector元素时触发SIGSEGV段错误,问题何在?
问题原因及解决办法
你的std::copy代码触发段错误的核心原因是:目标容器accounts初始为空,没有足够的存储空间来容纳要复制的元素。std::copy仅负责将元素写入迭代器指向的位置,不会自动为容器扩容,直接写入空容器的begin()位置属于访问非法内存,最终触发段错误。
原循环代码能正常运行(注意你原代码存在变量名冲突:容器名account和循环变量名account重复,应该是输入笔误,比如容器实际叫accounts、循环变量叫acc),是因为push_back会自动为容器扩容,每次添加元素时都会分配足够的内存空间。
修复方案
方案一:使用std::back_inserter(推荐,与原循环逻辑完全一致)
std::back_inserter会返回一个插入迭代器,每次赋值时会自动调用容器的push_back方法,帮你完成扩容和元素添加:
Ttran<std::vector<Lar>> get() const { const std::vector<json> value = res["value"]; std::vector<Lar> accounts; std::copy(value.begin(), value.end(), std::back_inserter(accounts)); return {res["context"], accounts}; }
方案二:预先分配空间后再执行copy
先通过reserve或resize为accounts分配与value相同大小的空间,确保有足够内存容纳元素:
Ttran<std::vector<Lar>> get() const { const std::vector<json> value = res["value"]; std::vector<Lar> accounts; accounts.reserve(value.size()); // 仅预留空间,不初始化元素 std::copy(value.begin(), value.end(), std::back_inserter(accounts)); // 也可以用resize初始化元素后直接copy // accounts.resize(value.size()); // std::copy(value.begin(), value.end(), accounts.begin()); return {res["context"], accounts}; }
内容的提问来源于stack exchange,提问作者Senor Maldona
相关产品推荐
相关产品推荐

