首页 > 解决方案 > 在 C++ 中使用 max_element 时出现分段错误

问题描述

根据其他建议,取消引用可能是问题,但即使在调用 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;
}

标签: c++vectorlambdasegmentation-faultmax

解决方案


的成员函数A

    vector<B> getArray()

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

您应该让函数返回对成员变量的引用array

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

推荐阅读