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累积一些我想在某个时候推送到我的向量的值。推送后,我需要重置 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)