为什么我得到一个无效的指针?

时间:2013-03-30 05:36:14

标签: c++ pointers free glibc

我正在为家庭作业写一个回溯问题,所有代码最后除delete[]之外都有效。

/*Assg4.cc*/
int main()
{
    //removed irrelevant code - see pastebin links if needed

    void *data = &datavector;
    bool finished = false;
    bool* continuance = &finished;
    int *a = new int[n+1];
    for(int i=0; i<n; i++)
    {
        a[i] = NULL;
    }

    delete []a;
    delete continuance;

return 0;
}

我收到以下错误:

  

*** glibc检测到*** ./Assg4:free():无效指针:0xbfc7098f ***

函数backtrack()仅在某个时刻填充数组a[]的内容,它不会以任何方式删除,扩展或缩小数组。我知道问题在于最后的删除,因为当我将它们注释掉时,我没有得到任何错误(并且所有计算的结果都是正确的)。我做错了什么?

Pastebin完整文件:

Assg4.cc

backtrack.cc & backtrack.h

2 个答案:

答案 0 :(得分:5)

非常确定您的错误实际上在这里:

delete continuance;

您正在尝试删除在堆栈上分配的内容,因为continuance指向finished,这是在堆栈上分配的(不调用new)。堆栈上的项目将在超出范围时自动销毁,因此您不必担心删除continuance

请参阅:What and where are the stack and heap

答案 1 :(得分:3)

bool finished = false;
bool* continuance = &finished;

delete continuance;

您正在使用delete未分配的指针上调用new。这导致未定义的行为 finished是一个自动/局部变量,一旦声明它的范围{ }结束,它就会被自动销毁。

规则很简单:

除非您致电delete,否则请勿致电new