【问题标题】:Passing Vector by Reference- Segmentation Fault C++按引用传递向量 - 分段错误 C++
【发布时间】:2014-08-18 01:23:33
【问题描述】:

我已经通过引用查找了传递向量,看起来我正在做的事情应该可行。我只为向量分配了 1 个值对此进行了测试,但我仍然遇到分段错误。任何帮助或想法为什么会发生这种情况将不胜感激。

伪代码:

    template <class X>
    void class<X>::function(const X &A, const X &B, vector<X>&results) const {

         int temp = A;
         int i = 0;

         while (temp > B){
               if(another_function(temp)){
                    results[i] = temp;
                    i++;
               }
         }
    }

基本上,A 将始终大于 B,因此每次都会发生 while 循环。 "another_function" 接受一个 int 值,如果满足某些条件则返回 true,并且每次都减小它的值。我在向量中只存储 3 个元素的情况下对其进行了测试,但仍然出现分段错误(核心转储)错误...

编辑:我还注释掉了results[i] = temp;,它运行良好。

【问题讨论】:

  • 你怎么知道你没有注销结果的结尾?没有检查 i
  • 如何将 temp 传递给 another_function()?通过参考还是通过价值?希望通过参考,但请确认。
  • 好吧,我想我猜我想只用 3 个元素尝试它的大小不会接近...我添加了检查,我不再遇到分段错误,但没有元素存储在结果中...啊....向量的大小在模板化后会发生变化吗?
  • results.push_back(temp);
  • 是的@Oleg,它也是通过引用传递的。我不再遇到段错误,但没有存储任何元素。使用所有模板作为整数对其进行测试以保持一致性

标签: c++ vector reference core


【解决方案1】:

通过引用传递向量有效。这是事实 :) 在您的情况下不起作用的是您无法保证您的索引不会超过向量的末尾。 你的代码必须保证每次你这样做

results[i] = temp;

,i 总是小于 results.size()。

【讨论】:

  • 谢谢。这消除了分段错误,并且 push_back() 使其正常工作。
【解决方案2】:

除非您为vector 预留了足够的容量,否则您应该使用push_back

换行

results[i] = temp;

通过

results.push_back(temp);

【讨论】:

    猜你喜欢
    • 2017-03-14
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2015-05-21
    相关资源
    最近更新 更多