我正在为家庭作业写一个回溯问题,所有代码最后除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完整文件:
答案 0 :(得分:5)
非常确定您的错误实际上在这里:
delete continuance;
您正在尝试删除在堆栈上分配的内容,因为continuance
指向finished
,这是在堆栈上分配的(不调用new
)。堆栈上的项目将在超出范围时自动销毁,因此您不必担心删除continuance
。
答案 1 :(得分:3)
bool finished = false;
bool* continuance = &finished;
delete continuance;
您正在使用delete
未分配的指针上调用new
。这导致未定义的行为
finished
是一个自动/局部变量,一旦声明它的范围{ }
结束,它就会被自动销毁。
规则很简单:
除非您致电delete
,否则请勿致电new
。