Освобождение указателя на символ стирает его с того места, где я его сохраняю - PullRequest
0 голосов
/ 19 февраля 2019
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 ()

1 Ответ

0 голосов
/ 19 февраля 2019

Вы должны освобождать объекты в вашем векторе, когда вы освобождаете свой вектор.Для объектов (например, строк) без дочерних объектов вы можете просто позвонить бесплатно.Если вы хотите получить больше фантазии, вы можете сохранить указатель функции на определенную свободную функцию для каждого объекта и вызывать ее, когда вы освобождаете свой вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...