【问题标题】:Why don't need to use free() function in this case?为什么在这种情况下不需要使用 free() 函数?
【发布时间】:2020-11-29 11:20:07
【问题描述】:

所以这是一个简单的代码。我不会进一步解释。我的问题是,如果我使用 free() 它会导致

*** `./main' 中的错误:free():无效指针:0x00007ffee58389f8 *** 错误,

但我不完全明白为什么。是因为我给了ptr一个循环变量地址吗?如果我删除 free() 函数调用,它会完美运行,但我很好奇是什么原因造成的。

#include <stdio.h>
#include <stdlib.h>
int main()
{
  int num;
  printf("Give me a number:\n");
  scanf("%d", &num);

  int *ptr = malloc(sizeof(int) * num);

  for (int i = 0; i < num; ++i)
  {
    ptr = &i;
    printf("%d\n", *ptr);
  }
  free(ptr);
  return 0;
}

【问题讨论】:

  • ptr = &amp;i; 您已将ptr 更改为指向ii 变量不是堆(动态)内存,因此无法释放。你到底打算在那里做什么?
  • 只是玩弄指针,没什么特别的。谢谢回答。 :)
  • 好的,但即使从逻辑上讲也没有意义。这就像在做a = 1; a = 2;。显然,第一个值会因用第二个值覆盖而丢失。在这种情况下,丢失的是 malloc 值,因此无法释放它。
  • 是的,我知道,只是尝试一下

标签: c malloc free


【解决方案1】:

来自Valgrind

绝对丢失”。这意味着没有指向块的指针可以 成立。该块被归类为“丢失”,因为程序员可以 不可能在程序退出时释放它,因为没有指向它的指针 存在。这可能是指针在某些位置丢失的症状 程序中的较早点。此类情况应由 程序员。

在代码中,指向 malloc 内存的指针已被修改 (ptr = &amp;i) 所以,我们丢失了指向内存的指针。 而且,您不应该释放堆栈内存。

【讨论】:

    【解决方案2】:

    您传递给free 的指针值必须malloccallocrealloc 返回的值。在这种情况下,您使用i 的地址重新分配了ptr,这不是*alloc 调用的结果。请注意,在此过程中,您丢失了对动态分配内存的唯一引用,因此您以后无法释放它;这称为内存泄漏。

    如果您执行 ptr++ 之类的操作,您会遇到同样的问题 - 您仍然指向动态分配的块内,但它又不是 *alloc 返回的地址,所以您会遇到同样的错误。

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 2017-07-15
      • 2016-08-08
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      相关资源
      最近更新 更多