释放双指针上的内存 //字符**p;在.h文件中声明 尺寸=5; 尺寸=尺寸(obj); p=(char**)malloc(bs); 对于(size_t i=0;i新版< /代码>分配适当的量。@ Mark:我猜您是想说“为什么C++的代码>新[] /代码>操作符更好”。 MalOC:在C++中完全相同,C++分配函数,如::运算符NeW()/Cuth>也需要字节数。OK,我把它改为(char **)Maloc(BS*sieZof(char));它仍然给我带来了同样的问题。这是真的,但泄漏不是正确的词。它实际上是一个溢出,因为超过末尾的元素都被访问。从技术上讲,泄漏是指当您忘记释放某些内容时。您已经识别了问题,但给出了错误的名称。好的,我将其更改为(char**)malloc(bs*sizeof(char*));它仍然给我带来了同样的问题。这是真的,但泄漏不是正确的词。它实际上是一个溢出,因为超过末尾的元素都被访问。从技术上讲,泄漏是指当您忘记释放某些内容时。您已识别出问题,但给出了错误的名称。

释放双指针上的内存 //字符**p;在.h文件中声明 尺寸=5; 尺寸=尺寸(obj); p=(char**)malloc(bs); 对于(size_t i=0;i新版< /代码>分配适当的量。@ Mark:我猜您是想说“为什么C++的代码>新[] /代码>操作符更好”。 MalOC:在C++中完全相同,C++分配函数,如::运算符NeW()/Cuth>也需要字节数。OK,我把它改为(char **)Maloc(BS*sieZof(char));它仍然给我带来了同样的问题。这是真的,但泄漏不是正确的词。它实际上是一个溢出,因为超过末尾的元素都被访问。从技术上讲,泄漏是指当您忘记释放某些内容时。您已经识别了问题,但给出了错误的名称。好的,我将其更改为(char**)malloc(bs*sizeof(char*));它仍然给我带来了同样的问题。这是真的,但泄漏不是正确的词。它实际上是一个溢出,因为超过末尾的元素都被访问。从技术上讲,泄漏是指当您忘记释放某些内容时。您已识别出问题,但给出了错误的名称。,c++,c,malloc,free,double-pointer,C++,C,Malloc,Free,Double Pointer,我的代码在尝试释放for循环中p的最后一个元素时出现了停顿。有人知道我做错了什么吗 编辑:即使将其更改为(char*)malloc(bs sizeof(char*)),我仍然有相同的问题 这仍然不起作用: //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] = (ch

我的代码在尝试释放for循环中p的最后一个元素时出现了停顿。有人知道我做错了什么吗

编辑:即使将其更改为(char*)malloc(bs sizeof(char*)),我仍然有相同的问题

这仍然不起作用:

//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);
size\u t bs=5;
尺寸=尺寸(obj);
p=(char**)malloc(bs*sizeof(char*);
对于(size_t i=0;i
使用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 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);
size\u t bs=5;
尺寸=尺寸(obj);
p=(char**)malloc(bs*sizeof(char*);
对于(size_t i=0;i
所以问题似乎在于这段代码

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);
(大小j=0;j
我希望这是一个隐式链表,有人知道我做错了什么吗?

在第一个malloc中,您不需要5个字节,而是指针的5倍

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

在第一个malloc中,您不需要5字节,而是需要指针的5倍

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

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

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

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

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

问题是你:

  • 分配一个由5个指针组成的数组
  • 分配5个字符数组并将它们存储在第一个数组中
  • 在数组中向下移动这些指针,覆盖(并丢失)第一个指针并复制最后一个指针
  • 尝试释放数组中的5个指针
因此,在最后一步中,您将释放一个指针两次(因为
p[3]
p[4]
的最后两个条目是相同的),从而导致未定义的行为

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

p = malloc(bs * sizeof(char*));
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

问题是你:

  • 分配一个由5个指针组成的数组
  • 分配5个字符数组并将它们存储在第一个数组中
  • 在数组中向下移动这些指针,覆盖(并丢失)第一个指针并复制最后一个指针
  • 尝试释放数组中的5个指针
因此,在最后一步中,您将释放一个指针两次(因为
p[3]
p[4]
的最后两个条目是相同的),从而导致未定义的行为

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

p = malloc(bs * sizeof(char*));
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

为什么使用C++时,C++标记是MaLoC ?是C还是C++?我想这两种方法都是有效的,但可能只选择一种。您可能会发现,
&(pool[j+1][0])
pool[j+1]
完全相同?@Ed:iteration index在
括号内声明;这看起来像是C++的特性。(在C++版本中添加了它吗?为什么C++标签使用了<代码> MalOC ?是C还是C++?我猜这两者都是有效的,但可能只是选择一个。你可能知道的重复:<代码> &(池[j+1 ] [0 ])< /> >与<代码>池[j+1 ]完全一样。<代码> > < ED> >内,迭代索引在括号中声明;这看起来像是C++特性。(它在后来的C版本中添加了吗?这是C++更好的原因之一。它将用<代码>新< /COD>分配适当的量。@ Mark:我想你是想说为什么C++的代码<新[] /代码>操作符更好”。在C++中,代码> MalCal完全相同,C++分配函数如<代码>::运算符NeXOR()/C++ >也需要字节数。这就是C++更好的原因之一。它将用“代码>新版< /代码>分配适当的量。@ Mark:我猜您是想说“为什么C++的代码>新[] /代码>操作符更好”。<代码> MalOC:<代码>在C++中完全相同,C++分配函数,如<代码>::运算符NeW()/Cuth>也需要字节数。OK,我把它改为(char **)Maloc(BS*sieZof(char));它仍然给我带来了同样的问题。这是真的,但泄漏不是正确的词。它实际上是一个溢出,因为超过末尾的元素都被访问。从技术上讲,泄漏是指当您忘记释放某些内容时。您已经识别了问题,但给出了错误的名称。好的,我将其更改为(char**)malloc(bs*sizeof(char*));它仍然给我带来了同样的问题。这是真的,但泄漏不是正确的词。它实际上是一个溢出,因为超过末尾的元素都被访问。从技术上讲,泄漏是指当您忘记释放某些内容时。您已识别出问题,但给出了错误的名称。