【问题标题】:How many bytes will be deallocated with free() after changing the pointer?更改指针后 free() 将释放多少字节?
【发布时间】:2018-11-06 02:58:15
【问题描述】:

我有以下代码。

char* p = malloc(10);
p = p + 1;
free(p);

在上面的代码中,

  1. malloc在调用malloc(10)时如何返回内存地址?
  2. free(p)将释放多少字节?
  3. free()如何知道要释放多少字节?

【问题讨论】:

  • 这样做是未定义的行为。不允许将修改后的指针传递给 free。最好的希望是崩溃。
  • 你必须得到一个错误
  • @purec,很遗憾不是,这是未定义的行为
  • 我的编译器给了我错误
  • *** `./a.out' 中的错误:free():无效指针:0x086e9009 *** 中止

标签: c++ c malloc free


【解决方案1】:

free 的手册页会告诉您,除了从 malloc 返回的指针之外的任何参数都有未定义的行为:

free() 函数释放 ptr 指向的内存空间,该空间必须由之前对 malloc()、calloc() 或 realloc() 的调用返回。否则,或者如果之前已经调用过 free(ptr),则会发生未定义的行为。如果 ptr 为 NULL,则不执行任何操作

关于free 如何知道块的大小:典型的内存分配器实现对每个块都有一个头(包含大小、空闲列表指针等),free 知道这个头的大小和从malloc返回的指针。

这也回答了你的第一个问题:malloc 分配了这样一个块并返回一个指向实际对象开头的指针。

【讨论】:

  • 太棒了!谢谢你的解释。
猜你喜欢
  • 2011-10-28
  • 2015-03-08
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2014-01-12
  • 2011-02-03
  • 1970-01-01
  • 2014-11-28
相关资源
最近更新 更多