【问题标题】:Why am I getting an invalid pointer?为什么我得到一个无效的指针?
【发布时间】:2013-03-20 20:54:36
【问题描述】:

我正在为作业写一个回溯问题,所有代码都可以正常工作,除了最后我的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(): invalid pointer: 0xbfc7098f ***

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

Pastebin 完整文件:

Assg4.cc

backtrack.cc & backtrack.h

【问题讨论】:

  • 我没有代表发布超过 2 个链接,这就是为什么 backtrack.cc 和 backtrack.h 在同一个粘贴中
  • 删除你的新内容,删除[]你的新内容[]。你不是新的finished
  • 你对指针的使用似乎是随意的。
  • @andre - 我必须实现 backtrack.h 的定义函数。指针的使用令人困惑

标签: c++ pointers free glibc


【解决方案1】:
bool finished = false;
bool* continuance = &finished;

delete continuance;

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

规则很简单:

除非你打电话给new,否则不要打电话给delete

【讨论】:

    【解决方案2】:

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

    delete continuance;
    

    您正试图删除分配在堆栈上的东西,因为continuance 指向分配在堆栈上的finished(没有调用new)。堆栈上的项会在超出范围时自动销毁,因此您不必担心删除continuance

    见:What and where are the stack and heap

    【讨论】:

    • 你说得对 - 我以为我只用 delete []a 测试过它,但我没有。感谢您的回答!
    猜你喜欢
    • 2011-12-13
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2019-07-25
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多