C: перемещение свободных операторов в отдельную функцию вызывает утечку памяти - PullRequest
0 голосов
/ 13 июня 2018

У меня есть следующая структура и его инициализация в файле C:

struct Lattice {
    int length;
    int** latt;
};

struct Lattice* Create(int size){
    struct Lattice latt;
    int i,j,k,l;

    latt.length = size;
    latt.latt = malloc(sizeof(int*) * latt.length);

    for(i=0; i<latt.length; i++){
        latt.latt[i] = malloc(sizeof(int) * latt.length);
    }

        for(j=0; j<latt.length; j++){
            for(k=0; k<latt.length; k++){
                latt.latt[j][k] = 0;
            }
        }

    struct Lattice* lattp = &latt;
    return lattp;

И у меня также есть функция освобождения памяти:

void Destroy(struct Lattice* lattp){
    int l;
    for (l=0; l<(lattp->length); l++){
        free(lattp->latt[l]);
    }
    free(lattp->latt);
}

Но всякий раз, когда я запускаю код:

int main(){
    struct Lattice* lattp = Create(5);
    Destroy(lattp);

    return 0;
}

Я получаю утечку памяти (согласно Valgrind это определенно потеряно 40 байтов и косвенно потеряно еще 80, если это имеет какое-то значение).

Но если у меня есть идентичный код, за исключением того, что я записываю свободные операторы, которые идентичны операторам Destroy, в Create (и соответствующим образом изменяю операторы возврата), я не получаю утечку памяти.Почему перемещение свободных операторов в отдельную функцию вызывает утечку памяти?

1 Ответ

0 голосов
/ 13 июня 2018

Ваша функция Create() возвращает адрес локальной переменной:

struct Lattice* Create(int size){
    struct Lattice latt;  // this is a local variable - it only exists
                          // as long as the function Create() is running
    int i,j,k,l;

    latt.length = size;
    latt.latt = malloc(sizeof(int*) * latt.length);

    for(i=0; i<latt.length; i++){
        latt.latt[i] = malloc(sizeof(int) * latt.length);
    }

        for(j=0; j<latt.length; j++){
            for(k=0; k<latt.length; k++){
                latt.latt[j][k] = 0;
            }
        }

    struct Lattice* lattp = &latt;  // this takes the address of a local variable
    return lattp; // after this return, latt no longer exists
}

Это неопределенное поведение .

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