Невозможно освободить дочерний элемент родительской структуры - PullRequest
0 голосов
/ 07 ноября 2018

У меня странная ошибка, из-за которой я не могу освободить () структуру, для которой у меня есть malloc () RAM.

У меня есть структура parent и child, где child - это структура типа int. Я использую malloc () для выделения ram как для родительских, так и для дочерних структур (где дочерней структурой является malloc () для размера массива дочерней структуры). Затем я использую memcpy для копирования массива в родительскую структуру.

#include <stdlib.h>
#include <stdio.h>
#include <string.h> 

typedef struct child child_t;
typedef struct parent parent_t;

struct child {
    int item;
};

struct parent {
    child_t *_child;
};

child_t list[] = {
    { .item = 1 },
    { .item = 2 },
    { .item = 3 },
};

int main(void) {
    parent_t *_parent = malloc(sizeof(parent_t));

    _parent->_child = malloc(sizeof(list));
    memcpy(&_parent->_child, &list, sizeof(list));

    free(_parent->_child);
    free(_parent);
    printf("success\n");
    return 1;
}

free(_parent->_child); в итоге выдает мне сообщение Aborted (core dumped) в качестве ошибки. Я проверил использование оперативной памяти и могу сказать, что должен освободить ребенка, но я не уверен, как это сделать.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вы должны удалить & s из оператора memcpy. _parent->_child уже является адресом, а массив list[] распадется на указатель. В результате вы перезаписываете сам элемент-указатель (и другие) вместо памяти, на которую он указывает.

memcpy(_parent->_child, list, sizeof(list));

Вот почему вы не можете

free(_parent->_child);

потому что вы удалили указатель, который пытаетесь free.

0 голосов
/ 07 ноября 2018

memcpy(&_parent->_child, &list, sizeof(list)); это проблема.

Попробуйте с:

memcpy(_parent->_child, list, sizeof(list));

Подпись memcpy:

void *memcpy(void *str1, const void *str2, size_t n)

и вы вместо этого передаете указатель на указатель.

Это вызывает неопределенное поведение, потому что ваши буферы содержат мусор, который free() не может использовать.

...