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
temp, данные, которые я вставил в свой вектор, были потеряны.Очевидно.Поэтому я использовал strdup
, но потом у меня появились утечки памяти.
Поэтому я решил расширить strdup
и освободить символ *, который он возвращал.Но, конечно, это ставит меня в ту же ситуацию, что и в прошлый раз.
Я просто не уверен, как перенести мои данные в вектор, а затем сбросить «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 - освобождение памяти после strdup ()