C 如何释放分配给本地静态指针的内存
在遗留的C代码中,我有一个指针,基本上是一个数组,大小等于枚举数的一个,它在局部范围内是静态的。但是现在我必须删除这个枚举,现在这个静态局部数组给出了一个错误。我可以将该数组转换为普通指针,然后动态地分配它,但我不知道如何做到这一点。下面是我从现有代码库中简化的示例代码C 如何释放分配给本地静态指针的内存,c,C,在遗留的C代码中,我有一个指针,基本上是一个数组,大小等于枚举数的一个,它在局部范围内是静态的。但是现在我必须删除这个枚举,现在这个静态局部数组给出了一个错误。我可以将该数组转换为普通指针,然后动态地分配它,但我不知道如何做到这一点。下面是我从现有代码库中简化的示例代码 enum { E1, E2, EOL }; void func { //static int array[EOL]; //-> that how it was earlier static int *array = (i
enum
{
E1,
E2,
EOL
};
void func
{
//static int array[EOL]; //-> that how it was earlier
static int *array = (int*)malloc(sizeof(int)*EOL); //Will this allocated memory only once
//or on every invokation.
free(array);//will it free the memory more than once?
}
现在我可以将数组指针移动到全局范围,然后在main中分配它,并在atexit函数中释放它,但我希望保持最小的更改,因为我不确定它在共享项目中会产生什么影响
谢谢,malloc只会发生一次 1) 您可以使用静态布尔值来知道数组变量中的指针是否可用
2) 您可以释放指针,然后将其设置为NULL。下一次使用free将不起任何作用。如果希望使更改保持最小,只需将枚举定义移到函数体中此静态变量之前即可。或者,您甚至可以将一个未命名的枚举与一个枚举数一起用于数组的大小 我不理解您试图用数组替换动态分配的数组
此外,目前C允许使用可变长度数组。因此,您可以这样定义函数,即它有一个参数来指定本地(非静态)数组的大小。如果使用C,则不能使用非常量初始化静态变量
如果你使用C++,那么静态指针只会得到一次分配给它的内存指针。
< P>我用一个函数解决了这个问题,它基本上是收集所有分配给本地静态指针的内存,就像其他函数一样,在使用ATSutualStutabor。struct node
{
node *next;
void *content;
};
node* head = NULL, tail =NULL;
void addToList(void* ptr)
{
struct node* p = (struct node*)malloc(sizeof(struct node));
p->next = NULL;
p->conent = ptr;
tail->next = p;
tail = p;
return;
}
void freeList()
{
struct node* p = NULL, p1 = NULL;
for(p = head; p != NULL; p = p->next)
{
free(p1);
free(p->content);
p1 = p;
}
head = tail = NULL;
return;
}
/*
*/
void func
{
//static int array[EOL]; //-> that how it was earlier
static int *array = (int*)malloc(sizeof(int)*EOL); //Will this allocated memory only once
addToList(array); //or on every invokation.
free(array);//will it free the memory more than once?
}
正如您在上面的代码中所看到的,链接列表是在单独的.c文件中创建的,并且使用.map方法head、tail和node将不会暴露给外部世界,只有addToList和freeList将可见。在每一个地方,在执行malloc之后,我都会调用addToList,然后freeList会释放内存
谢谢,这个解决方案很大程度上取决于你是在编程C或C++。请选择一种您想要解决方案的语言。这在C语言中甚至不起作用。关于
atexit
的讨论表明存在更大的问题。内存应该在最后一次调用func后释放,而不是在第一次调用后释放。我可能会泄露记忆。无论如何,操作系统将在退出后清理它。从atexit`调用free()
是毫无意义的。free(NULL)与delete NULL不同,不能保证无害。什么意思,“malloc只发生一次”?程序将无法编译@迈克尔:是的<代码>自由(空)代码>被指定为不执行任何操作。C997.20.3.2:2.@PascalCuoq-我的错误。这些天我没怎么做C,我记不清了。