【问题标题】:"attempt to free a non-heap object" in CC中的“尝试释放非堆对象”
【发布时间】:2021-07-23 04:50:18
【问题描述】:

示例代码

我写的代码有点像下面:

#include <stdio.h>
#include <stdlib.h>

struct record {
  ...
};

void record_cleanup(struct record *record)
{
  printf("Deleting record %p\n", record);
  free(record);
}

int main(void)
{
  struct record record;
  ...
  record_cleanup(&record);
  ...
  return EXIT_SUCCESS;
}

错误

但是,在编译时,我收到了一个错误:

warning: attempt to free a non-heap object

是什么原因造成的,为什么?

【问题讨论】:

  • record instance = malloc(sizeof(record));这是怎么回事?
  • 整个sn-p很混乱!
  • @SouravGhosh 作为一个仍在学习交易的相对较新的堆栈溢出用户,我尽量让我的问题和答案尽可能彻底......请更具体地说明你对什么感到困惑.关于您的第一条评论,即获取record 的大小,并进行malloc 调用以便为该结构分配内存。我已经对我的问题进行了编辑,因为 malloc 返回 void* 并且必须转换为指针类型。
  • 那个小小的* 有很大的不同,你知道的!
  • 变量instance,在这种情况下,是否分配了从具有相应参数的参数接收到的值,该参数具有分配的内存。关键是,instance 是一个自动局部范围变量,&amp;instance 没有分配内存。变量的类型及其赋值令人困惑,因为在这种情况下它们并不真正相关/相关。

标签: c memory


【解决方案1】:

您的问题来自free(record)

record_cleanup:

free(record);

main:

struct record record; /* stack-allocation; cannot be free()ed */
...
record_cleanup(&record); /* calls free(record), which isn't allowed */

【讨论】:

    猜你喜欢
    • 2020-12-24
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2015-04-25
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多