释放char指针会从我保存它的地方删除它

时间:2019-02-19 02:46:29

标签: c

I have a function `vector_push` that pushes data to a vector like this:

    void vector_push(vector *v, void *item)
    {
        if (v->capacity == v->size)
            vector_resize(v, v->capacity * 2);
        v->data[v->size++] = item;
    }

这是vector_push中非常标准的c函数。现在,我正在尝试使用此功能将一些数据传输到其中:

int transfer(char temp[100], vector *v) {
        vector_push(v, strdup(&temp[0]));
        memset(temp, 0, 100);
        return 0;
    }

问题是strdup泄漏。所以,我改为这样写:

int transfer(char temp[], vector *v) {
    char *d = malloc(strlen(&temp[0]) + 1);
    strcpy(d, &temp[0]);
    vector_push(v, d);
    memset(temp, 0, 100);

    return 0;
}

这几乎是strdup函数。

先进行一些解释。 temp会产生一些我想在某个时候推送到向量的值。按下后,我需要重设温度并从上次中断的地方再次开始向其中累加数据。但是,当我memset临时时,我推送到向量中的数据丢失了。明显。因此我使用了strdup,但是随后出现内存泄漏。

所以我决定扩展strdup并释放它返回的char *。但这当然使我处于与上次相同的境地。

我只是不确定如何将数据推送到向量中,然后重置“ temp”而不会泄漏,也不会丢失向量中的数据。我该怎么办?

编辑:

Valgrind输出:

==16158==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16158==    by 0x4ED99B9: strdup (strdup.c:42)
==16158==    by 0x1099A6: transfer (tokens.c:20)
==16158==    by 0x109AF2: tokenize (tokens.c:35)
==16158==    by 0x109848: main (nush.c:246)
==16158== 
==16158== LEAK SUMMARY:
==16158==    definitely lost: 17 bytes in 3 blocks
==16158==    indirectly lost: 0 bytes in 0 blocks
==16158==      possibly lost: 0 bytes in 0 blocks
==16158==    still reachable: 0 bytes in 0 blocks
==16158==         suppressed: 0 bytes in 0 blocks
==16158== 
==16158== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
==16158== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

C - Freeing memory after strdup()

1 个答案:

答案 0 :(得分:2)

释放向量时,应该释放向量中的对象。对于没有子对象的对象(例如字符串),您可以简单地调用free。如果您想花更多的钱,可以为每个对象存储一个指向特定自由函数的函数指针,并在释放向量时调用它。