【问题标题】:free up memory on a double pointer释放双指针上的内存
【发布时间】:2014-02-15 23:52:12
【问题描述】:
//char char **p; declared in .h file
size_t bs = 5;
size_t Size = sizeof(obj);
p = (char**)malloc(bs);
for (size_t i = 0; i < bs;i++){p[i] = (char*)malloc(Size);}

for (size_t j = 0; j < bs-1; j ++){p[j] = &(p[j + 1][0]); }

for (size_t i = 0; i < bs; i++){free(p[i]);}

free(p);

我的代码在尝试释放 for 循环中 p 的最后一个元素时停止。任何人我可能做错了什么?

编辑:即使将其更改为 (char*)malloc(bs sizeof(char *));

这仍然不起作用:

size_t bs = 5;
size_t Size = sizeof(obj);
p = (char**)malloc(bs* sizeof(char *));
for (size_t i = 0; i < bs;i++){p[i] = (char*)malloc(Size);}
for (size_t j = 0; j < bs-1; j ++){p[j] = &(p[j + 1][0]); }
for (size_t i = 0; i < bs; i++){free(p[i]);}
free(p);

使用 new 代替 malloc 也不能解决问题

但是,这段代码可以很好地释放内存。

size_t bs = 5;
size_t Size = sizeof(obj);
p = (char**)malloc(bs* sizeof(char *));
for (size_t i = 0; i < bs;i++){p[i] = (char*)malloc(Size);}
for (size_t i = 0; i < bs; i++){free(p[i]);}
free(p);

所以问题似乎与这段代码有关

for(size_t j = 0; j < bs-1; j ++){p[j] = &(p[j + 1][0]); }

我希望这是一个隐式链表,有人知道我在做什么错吗?

【问题讨论】:

  • 为什么在使用malloc时使用C++标签?
  • 是 C 还是 C++?我想这在任何一个中都有效,但可能只选择一个。
  • free a double pointer 的可能重复项
  • 您意识到&amp;(pool[j + 1][0])pool[j + 1] 完全相同?
  • @Ed:迭代索引在for括号内声明;对我来说,这看起来像是 C++ 功能。 (它是在后来的 C 版本中添加的吗?

标签: c++ c malloc free double-pointer


【解决方案1】:

问题是你:

  • 分配一个包含 5 个指针的数组
  • 分配 5 个字符数组并将它们存储在第一个数组中
  • 在数组中向下移动这些指针,覆盖(并丢失)第一个指针并复制最后一个指针
  • 尝试释放数组中的 5 个指针。

因此,在最后一步,您释放了两次指针(因为 p[3]p[4] 的最后两个条目相同),导致未定义的行为。

您说您想要“一个隐式链表”,这意味着您正在尝试将指针填充到对象中(而不是像您正在做的那样填充到顶级数组中),在这种情况下您想要类似的东西:

for(size_t j = 0; j < bs-1; j ++) { *(char **)p[j] = p[j + 1]); }
*(char **)p[bs-1] = 0;  // null terminate the linked list

这假定obj 的定义类似于:

struct obj {
    struct obj *next;
    // more fields

【讨论】:

    【解决方案2】:

    在第一个 malloc 中,您不需要 5 个字节,但需要 5 个指针。

    p = (char**)malloc(bs * sizeof(char *));
    

    【讨论】:

    • 好吧,我把它改成了 (char**)malloc(bs * sizeof(char *));它仍然给我同样的问题。
    • 这是真的,但 leak 用词不当。这实际上是一个溢出,因为访问了末尾的元素。
    • 技术上的泄漏是当你忘记释放某些东西时。您已经确定了问题,但给了错误的名称。
    【解决方案3】:

    您没有为指针分配足够的空间。改为

    p = malloc(bs * sizeof(char*));
    

    【讨论】:

    • 这是 C++ 更好的原因之一。它会使用new 分配适当的数量。
    • @Mark:我猜你的意思是说“为什么 C++ 的 new[] 运算符更好”? malloc 在 C++ 中的作用完全一样,::operator new() 等 C++ 分配函数也需要字节数。
    猜你喜欢
    • 2021-08-07
    • 2016-05-23
    • 2020-06-23
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2013-06-30
    相关资源
    最近更新 更多