Адрес valgrind равен 0 байтов после блока размером 4 - PullRequest
0 голосов
/ 06 января 2019

Я работаю над математической библиотекой.

create_vector создать вектор измерения n: (v1, v2, v3, ..., vn)

delete_vector освободить память.

struct Vector
{
    unsigned int dimension;
    double *components;
};
typedef struct Vector *vector_t;

vector_t create_vector(const unsigned int dimension)
{
    if(!dimension)
        return NULL;

    vector_t vector = (vector_t)malloc(sizeof(struct Vector));
    vector->dimension = dimension;
    vector->components = (double *)calloc(dimension, sizeof(double));

    return vector;
}

void delete_vector(vector_t *vector)
{
    if(*vector == NULL)
        return;

    free((*vector)->components);
    free(*vector);
    *vector = NULL;
}

Основной файл:

int main()
{
    vector_t vector1 = create_vector(3);
    delete_vector(&vector1);
}

В основном файле я использую эти две функции, но valgrind выдает мне эти предупреждения. Нет никаких утечек памяти. Как я могу решить?

==6906== Invalid write of size 4
==6906==    at 0x108800: create_vector (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==    by 0x10877E: main (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==  Address 0x4b3702c is 0 bytes after a block of size 4 alloc'd
==6906==    at 0x483021B: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==6906==    by 0x1087DC: create_vector (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==    by 0x10877E: main (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==
==6906== Invalid read of size 4
==6906==    at 0x10882B: delete_vector (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==    by 0x108790: main (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==  Address 0x4b3702c is 0 bytes after a block of size 4 alloc'd
==6906==    at 0x483021B: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==6906==    by 0x1087DC: create_vector (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==    by 0x10877E: main (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==
==6906==
==6906== HEAP SUMMARY:
==6906==     in use at exit: 0 bytes in 0 blocks
==6906==   total heap usage: 2 allocs, 2 frees, 28 bytes allocated
==6906==
==6906== All heap blocks were freed -- no leaks are possible
==6906==
==6906== For counts of detected and suppressed errors, rerun with: -v
==6906== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

1 Ответ

0 голосов
/ 06 января 2019

Вы уверены, что не скомпилированы с malloc(sizeof(vector_t));, а не с malloc(sizeof(struct Vector));?

блок размером 4 alloc'd указывает, что malloc только 4 байта, являющиеся размером указателя, если у вас 32-битный процессор, размер структуры составляет минимум 8 байтов

...