【问题标题】:Segmentation fault while using max_element in c++在 C++ 中使用 max_element 时出现分段错误
【发布时间】:2021-06-13 20:26:10
【问题描述】:

根据其他建议,取消引用可能会出现问题,但我在调用 max_element 函数时甚至在取消引用之前就遇到了分段错误。

最小的可重现示例:

#include <bits/stdc++.h>
using namespace std;

class B
{
    public:
    int a, b;
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
};
class A
{
    public:
    vector<B> array;
    A()
    {
        array.resize(5);
        array[0].a = array[0].b = 3;
        array[1].a = array[1].b = 5;
        array[2].a = array[2].b = 7;
        array[3].a = array[3].b = 1;
        array[4].a = array[4].b = 2;
    }
    vector<B> getArray()
    {
        return array;
    }
};

int main()
{
    A aobj;
    B maxE = *std::max_element(aobj.getArray().begin(), aobj.getArray().end(),
        [](B jobA, B jobB) {
        return jobA.getA() < jobB.getA();
    });
    
    cout<<maxE.getA();
    return 0;
}

【问题讨论】:

  • 应该是std::vector&lt;B&gt;&amp; getArray(){ return array; }
  • 阅读参考
  • 但是为什么我得到分段错误
  • 你访问被破坏的临时元素,即使生命周期被延长,你也会使用 2 个不同的容器来限制,所以你会有越界访问。

标签: c++ vector lambda segmentation-fault max


【解决方案1】:

A的成员函数

    vector<B> getArray()

正在返回一份成员变量array。调用它两次将生成两个独立的副本,因此将它们与std::max_element 一起使用是危险的。

你应该让函数返回一个对成员变量array的引用。

    vector<B>& getArray() // add &

【讨论】:

  • const vector&lt;B&gt;&amp; getArray()
  • 但是这里的分段错误有什么意义呢?
  • @FarhanAhmed -- 在问题的代码中,getArray().begin()getArray().end() 是两个不同数组的迭代器。这意味着它们没有划定一个有效的范围,当它们被传递给一个假设它们这样做的算法时,可能会发生不好的事情。
  • @FarhanAhmed 如果没有 UB,这两个迭代器必须指向同一个容器。可能该算法试图通过递增另一个数组的开头来到达一个数组的末尾并访问不属于其中任何一个的内存
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 2016-09-15
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2020-05-29
相关资源
最近更新 更多