如果进程执行一次并且连续运行,我们可以说进程正在泄漏内存,而进程内存只是动态分配一次,而不是使用free()函数调用释放。 基本上,该变量的内存在流程源代码的入口过程中分配,并且在初始化过程时称为一次。
这是流程的示例代码段
void caoamKeycodeInit(int *cesFd,int *sosFd,int *dcnFd,unsigned short gId,unsigned short suId,unsigned short sosSuId)
{
keycodeApiManager *caoamKeyApiInstance;
caoamKeyApiInstance = (keycodeApiManager*)malloc(sizeof(keycodeApiManager));
/*********rest of the proc code *****/
}
此处将内存分配给 caoamKeyApiInstance 指针变量,该变量的类型为 caoamKeyApiInstance ,它是 struct 变量。 将同样感谢您的输入。
答案 0 :(得分:0)
你应该区分丢失的和仍然可以访问的动态分配(就像Valgrind那样):如果没有更多指向动态内存的指针,那么该内存是< em>丢失,这应该被认为是一个编程错误,无论是循环还是增长,还是只有一次。
另一方面,如果你分配了几个全局资源并且没有清理它们,那么那些仍然可以访问:你可以释放它你想要,但你只是不打扰。这是一个不同的问题,虽然它可能不是非常优雅(和不起眼的调试),但它也不是世界末日。
以下是一个例子:
void * p, * q = malloc(100);
for (int i = 0; i != 10; ++i)
{
p = malloc(15);
}
在这种情况下,q
处的内存仍然可以访问,您可以在最后使用free(q);
释放它。另一方面,循环中十分之九的分配丢失,你永远无法恢复它们。
以下是如何设计类似循环的安全措施:使指针总是为NULL或有效的约定。
void * p = 0;
void free_it(void ** q) { free(*q); *q = NULL; }
void make_something(void *q)
{
free_it(q);
if (some_condition()) { q = malloc(100); }
}
int main()
{
p = malloc(25);
// ...
make_something(p);
// ...
free_it(p);
// ...
}
基本上,无论你当前是否持有动态内存,p
将始终准确地反映该状态,并且无论何时想要分配新内容,都可以安全地释放先前的指针值,因为它是要么有效又需要被释放或为空。