在 C++ 优先级队列中使用静态成员函数作为比较器时出现 AddressSanitizer 错误

问题描述 投票:0回答:1

我正在使用 C++ 中的priority_queue,并在使用静态成员函数作为类中的自定义比较器时遇到问题。

一个可重现的例子是:

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

class testClass {
private:
    static bool comp(const int& a, const int& b) {
        return a > b;
    }
    priority_queue<int, vector<int>, decltype(&testClass::comp)> q;

public:
    void push(int num) {
        q.push(num);
    }
};

int main() {
    testClass t;
    t.push(0);
    t.push(0);
    return 0;
}

第二次调用

push
会导致错误。我认为这意味着成员函数
comp
不能被
q
调用。

但是,当我将成员函数更改为类外部的 lambda 函数,然后使用

decltype(comp)
引用它时,代码可以正常工作。

有人可以解释为什么静态成员函数会导致这个问题,以及为什么 lambda 方法可以起作用吗?

c++ debugging lambda static-methods priority-queue
1个回答
1
投票

问题不在于您使用静态成员函数作为比较器。问题是你不使用它。

std::priority_queue<int, vector<int>, decltype(&comp)> q;

比较器不会传递给构造函数,并且使用一个默认构造函数(null)。

您应该将比较器传递给构造函数

std::priority_queue<int, vector<int>, decltype(&comp)> q{comp};

我打赌一定有重复的问题,但我找不到它。

© www.soinside.com 2019 - 2024. All rights reserved.