【问题标题】:C possible memory leak? CrashesC 可能的内存泄漏?崩溃
【发布时间】:2020-09-07 05:21:32
【问题描述】:

我正在尝试构建我自己的小哈希表库来取乐。 (在 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 的所有空字符串和指针的 N​​ULL 值初始化了结构数组。

【问题讨论】:

  • 第二次迭代会崩溃吗? temp不应该在循环块的末尾设置为e-&gt;ptr吗?
  • temp-&gt;ptr-&gt;str NULL?
  • Fiddling Bits 不,它在第一次崩溃。
  • 如果您的字符串不是动态分配的,则不应释放它们,例如free("ciao") 会崩溃。
  • 您需要一个while 循环而不是do-while 循环。

标签: c memory hashtable hash-function


【解决方案1】:

我好像你正在用这样的字符串文字初始化你的 char* :

char *str = "";

C 中的字符串字面量不是从堆中分配的,它们在程序中获得自己的内存空间,并在整个程序生命周期内保持在那里,即使 str 超出范围。

这就是为什么您不应该尝试释放作为字符串文字的char*。相反,您应该将 str 初始化为 NULL 并根据需要在堆上分配它们。然后你可以使用strcpy 来填充你的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-18
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    相关资源
    最近更新 更多