【发布时间】:2011-05-19 02:54:43
【问题描述】:
我的目标是重复运行 API 调用并检查内存泄漏。
API 接受整数输入并返回指向结构链表中第一个结构的指针作为输出。每个结构可能有其他类型的结构变量。
在下面的代码中,我试图代表我的问题。
问题出在 callApi() 函数中。我需要处理 API() 返回的结构“输出”占用的内存。即使我在这里使用 free(output),它也会导致内存泄漏,因为它指向嵌套结构的链表。 (信息来源:http://en.wikibooks.org/wiki/C_Programming/Memory_management)
问题:
离开退出 callApi() 调用时,当控制从函数返回到 main() 时,“输出”嵌套结构是否会过期?它会释放占用的整个内存吗?
请提出解决此内存泄漏问题的方法。
Can this problem be overcome with C++?
typedef struct{
int dev_size;
char *dev_name;
dev_stat *next_dev;
mem_stat *mem_info;
} dev_stat
typedef struct{
int mem_capacity;
char *mem_name;
} mem_stat
int main()
{
int input;
int return_val;
int callApi(int);
while(1)
{
return_val=callApi(input);
print return_val;
}
}
int callApi(int ip)
{
//Update: Memory allocation is unnecessary as it is done inside the API() call itself
//dev_stat *output=(dev_stat *)calloc(2,sizeof(dev_stat));
int ret_val;
ret_val=API(ip,&output);
free(output);
output=NULL;
return ret_val;
}
【问题讨论】:
-
什么是'int callApi(int);'在你的主要做什么?
-
该程序只是为了给出程序流程的一般概念。它不完全符合 C 语法。使用 callApi() 的原因:如果我在 main() 中调用 API(),则使用的变量将永远不会超出范围,直到程序结束。因此在 callApi() 中调用 API(),而后者又在 main() 中的无限循环中调用
-
这个问题可以用 C++ 解决吗?
-
@kk:在 C++ 中,您可能有
dev_name和std::string、next_dev和mem_info智能指针,因此您的结构会在释放时正确释放所有内存。但只要你的 API 不提供 C++ 风格的结构作为其输出,你就会陷入 C 风格的手动释放。
标签: c memory-management memory-leaks scope