【问题标题】:Free dynamic memory getting error释放动态内存出错
【发布时间】:2016-05-09 12:13:48
【问题描述】:

我遇到了释放动态内存的问题。我已经运行了其他人的示例代码,并且它有效。关键是我们使用相同的方式来释放内存,但我的没有用。它总是出现一个错误,

“CRT 检测到应用程序在堆缓冲区结束后写入内存。”

谁能帮我理解发生了什么?

void pop(Stackptr *ptr){
    Stackptr tmp = NULL;
    if(*ptr == NULL){
        printf("there is no element\n");
    }else{
        tmp = *ptr;
        *ptr= (*ptr)->nextptr;
        free(tmp);
    }
}

【问题讨论】:

  • Stackptr tmp 应该是 Stackptr *tmp*ptr == NULL 应该是 ptr == NULL。你的其他指针也有类似的错误。
  • 您的问题缺少上下文。 Stackptr 是什么? ptr 来自哪里?等等......发布代码的正确性完全取决于代码的其余部分。换句话说,可以说您的问题并未局限于发布的代码。

标签: c pointers memory free


【解决方案1】:

如我所见,错误是

 tmp = *ptr;

您希望将指针本身存储为 int tmp,而不是 值。

因此,下一个free(tmp); 变为非法,因为您传递的指针无效。在 malloc() 和家人之前未返回或已经 free()-d 之前未返回的指针上调用 free(),将调用 undefined behavior

也就是说,if(*ptr == NULL) 应该是 if(ptr == NULL),以检查指针的 N​​ULL 值。

故事的寓意:启用编译器警告。尝试修复编译器发出警告的问题。

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 2015-04-15
    • 2016-03-02
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多