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)
答案 0 :(得分:2)
释放向量时,应该释放向量中的对象。对于没有子对象的对象(例如字符串),您可以简单地调用free。如果您想花更多的钱,可以为每个对象存储一个指向特定自由函数的函数指针,并在释放向量时调用它。