-2

使用 c:

  char ptr[n];
  free(ptr);

在我看来:当“char ptr[n];” 已使用,内存已分配,并且 ptr 指向它, free(ptr) 应该可以工作。程序失败了,为什么?(n == 5 eg)有什么深入的分析吗?

4

5 回答 5

6

因为您调用free了未分配的变量malloc
这会导致未定义的行为。幸运的是,它会崩溃并且您可以检测到它,否则它可能会在最尴尬的时候崩溃。

您要求free释放堆分配变量的内存,您拥有的是本地存储上的一个数组(假设它在一个函数中),它会在创建它的作用域({})结束时自动释放。

于 2012-09-22T08:54:59.460 回答
2

因为这是你正在做的未定义的行为。(这意味着它实际上可以做任何事情,包括崩溃、看似正常运行、让守护进程飞出你的鼻子等。)你只能free()使用你获得的指针malloc()

自动数组不必是 free()'d。它们在作用域结束时被释放。

于 2012-09-22T08:55:01.760 回答
1

free由 分配的对象malloc。释放尚未分配的对象malloc是未定义的行为。

于 2012-09-22T08:54:44.907 回答
0

因为 `char ptr[n];' 不在堆栈内存中声明一个数组,并且它具有块的范围,这意味着它在块完成时从内存中销毁。

但是当你使用malloc(size)指针时,它会指向内存中的一块内存,它会占用程序员给它的范围。我的意思是,当你想销毁它时,你必须使用它,free(ptr)否则操作系统会在程序完成后释放它。

因此,当您使用free指向堆栈内存中的一块内存的指针时,它会导致未定义行为和程序崩溃,因为free仅在HEAP内存上操作。

于 2012-09-22T12:04:34.277 回答
0

这看起来很相似,在 c 中对 free 的调用是否会失败(SO) 根据标准,行为是未定义的,在某些情况下,您的代码不会那么快崩溃。它可能会在执行过程中破坏堆并在很晚的时候崩溃,并使调试变得困难。
在某种程度上,它取决于 malloc/free 方法的设计。

我知道的一种方法是:对于每个 malloc,一个额外的内存块附加到 malloc() 返回的块。此块包含调用 free() 时需要的一些内务数据。在您的情况下,由于内存不是由 malloc() 分配的,因此缺少此数据。所以 free() 试图在不知道它的垃圾的情况下使用你的数组之前的数据。

于 2012-09-24T07:00:29.250 回答