分段故障和运算符过载

Segmentation fault and operator overloading

本文关键字:运算符 故障 分段      更新时间:2023-10-16

考虑以下代码:

bool Queue::operator+=(int value) {
    std::cout << "Appending the value " << value;
    std::cout << " by using operator overloading." << std::endl;
    // in the actual code: q->append(value);
    return false;
}
int main() {
    Queue *q = new Queue();
    for (unsigned i = 0; i < 1000; i++) {
        q+=6;
    }
    q->append(6);
    delete q;
    return EXIT_SUCCESS;
}

我在实际实现中有更多的代码,但主要问题是:

我尝试使用运算符重载作为一个追加函数,它向Queue对象添加一个元素。主要功能与函数Queue::append配合使用。无论如何,我编译了这段代码,+=运算符重载编译时没有出现错误。但程序还是崩溃了。

调试时,似乎每当我在使用重载后使用Queue对象q(例如,只是析构函数或类似Queue::append的另一个函数)时,我都会出现分段错误

我不明白我做错了什么。

显然,在这个例子中,重载包括一个输出和返回一个bool

q被声明为指向Queue指针

表达式q += 6不使用您声明的运算符重载,它使用指针算术的标准运算符,并导致将指针地址添加到。

for循环之后,q不再指向Queue对象,并且访问它会导致分割故障。

要访问q指向的对象,必须取消引用指针,例如*q