gpt4 book ai didi

C - 在数组中使用 malloc() 存储指针,之后不能释放它们

转载 作者:行者123 更新时间:2023-12-01 16:40:06 24 4
gpt4 key购买 nike

我想将使用 malloc() 分配的 pointers 存储在 array 中,然后 free所有的人之后。然而,即使该程序没有提示它也不起作用。 cleanMemManager() 下面实际上不会释放 内存,因为在 main() char* pointer 内部测试时不是 NULL,它将打印 ???

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void **ptrList = NULL;

void tfree(void** ptr)
{
free(*ptr);
*ptr = NULL;
}

void* talloc(int size)
{
void* ptr = malloc(size);
ptrList[0] = ptr; ///No clue if this actually does what I think it does
return ptrList[0];
}

void initMemManager()
{
ptrList = (void**)malloc(sizeof(void**) * 3);
memset(ptrList, 0, sizeof(void**) * 3);
}

void cleanMemManager()
{
tfree(&ptrList[0]); //Doesn't free the right pointer it seems
}

int main()
{
initMemManager();
char* ptr = (char*)talloc(3);
cleanMemManager();

if (ptr != NULL) //This will trigger and I'm not expecting it to
printf("???");

getchar();
return 0;
}

我不明白用于此的语法,指针实际上根本没有被触及吗?因为它不会抛出任何错误,所以释放了什么?

最佳答案

main 中,char *ptr = (char*)talloc(3);ptr 声明为局部变量。它包含 talloc 返回值的副本,并且您的子例程都不知道 ptr 或它在哪里。所以他们都没有改变ptr的值。因此,当您到达 if (ptr != NULL) 时,ptr 的值没有改变。

另外:

  • initMemManager 中,您应该在两个有 sizeof(void**) 的地方使用 sizeof(void *) .在这些地方,您正在分配和复制 void * 对象,而不是 void ** 对象。

  • 看起来您正在尝试实现一种智能内存管理器,当指针被释放时,它会自动将指针设置为 NULL。要在 C 中做到这一点,您将不得不放弃指针的副本。例如,ptrptrList[0] 的副本,但是 tfree 只将传递给它的副本设置为 NULL。我们可以就构建这样一个系统提供建议,但它很快就会变得很麻烦——你的内存管理器需要保存一个指针及其副本(以及从它们派生的指针,如通过数组运算)的数据库。或者您必须通过 ptrList 数组间接引用所有内容,这会给您的源代码增添一些困惑。不幸的是,C 语言不是这方面的好语言。

关于C - 在数组中使用 malloc() 存储指针,之后不能释放它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47730560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com