c - C 可能的内存泄漏?崩溃
问题描述
我正在尝试构建自己的小哈希表库来取乐。(在 C 中)
我希望这对你来说不是太微不足道:由于可能的内存泄漏,我的程序崩溃了。问题出在我编写的一个函数中,用于在需要时释放分配给表的所有内存。
void destroy_table(struct elem* table, int len){ //releases the memory allocated to the table
int i;
for(i=0; i<len; i++){
struct elem* temp = table+i;
do{
struct elem* e = temp->ptr;
// printf("sono qui!\n");
free(temp->str); // <-- the program crashes here.
free(temp);
temp = e;
}while(temp != NULL);
}}
该表是一个结构元素数组,但可能会发生两个元素具有相同的索引。在这种情况下,会在该元素中构建一个列表。
这是我用来构建数组的结构:
struct elem{
char* str;
struct elem* ptr;};
我已经阅读了指南,所以我不会发布太多代码。但是我用 str 的所有空字符串和指针的 NULL 值初始化了结构数组。
解决方案
我好像你正在用这样的字符串文字初始化你的 char* :
char *str = "";
C 中的字符串文字不是从堆中分配的,它们在程序中获得自己的内存空间,并在整个程序生命周期内保持在那里,即使str
超出范围也是如此。
这就是为什么您不应该尝试释放char*
作为字符串文字的 a 的原因。相反,您应该初始化您的str
toNULL
并根据需要在堆上分配它们。然后,您可以使用strcpy填充您的字符串。
推荐阅读
- javascript - 用firebase和angularfire初始化一个firebase应用程序可以吗?
- node.js - 为什么“npm install”会删除不相关的包?
- typescript - 如何在 TypeScript 中使用 AST 解析通用条件类型?
- python - 如何修复codesignal python上classifyStrings代码的所有测试用例?
- laravel - 如何解决 laravel/vue 中的这个 npm run watch 错误?
- angular - Angular 9 在父组件的路由器出口中动态加载表单组件(创建/编辑)
- django - django 媒体图像不会显示
- javascript - JavaScript 将 id 添加到 ul 标签
- angular - 角度 ngif 语句添加更多条件
- batch-file - 批处理文件永久变量?