Определение наличия у члена структуры правильных данных перед попыткой освободить его - PullRequest
1 голос
/ 15 декабря 2011

Я использую приведенный ниже код для освобождения malloc ed памяти в структуре meshes, которая содержит triangleArrays и faces.

Это происходит сбой, потому что не каждая позиция в struct имеет данные.То, что я хочу сделать, это вызвать free, только если struct содержит данные в этом элементе массива.Однако использование if (self.meshes[meshIdx].triangleArrays[triangleArrayIdx].faces !=NULL), похоже, не работает.

for (int meshIdx = 0; meshIdx <=meshTriangleArrays; meshIdx ++) {
    for (int triangleArrayIdx = 0; triangleArrayIdx <=1; triangleArrayIdx ++) {
        if (self.meshes[meshIdx].triangleArrays[triangleArrayIdx].faces !=NULL) {
            free(self.meshes[meshIdx].triangleArrays[triangleArrayIdx].faces);
        }
    }
}

Ответы [ 3 ]

1 голос
/ 15 декабря 2011

Приведенный ниже код дает сбой, потому что не каждая позиция в структуре имеет данные.

Нет, сбой не происходит из-за передачи нулевого указателя на free(). Если вы передадите нулевой указатель, ничего не произойдет, см. документацию.

Какая ошибка выбрасывается? Также покажите нам свой код инициализации, то есть как вы распределяете faces и все, что находится над ним? Вероятно, вы передаете некоторые плохие / неинициализированные данные в free().

Кстати, из-за того, как вы задали этот вопрос, я полагаю, что вы думаете, что простое объявление массива заполнит каждый элемент NULL. Это не тот случай, они могут быть заполнены чем угодно, и если вы передадите это free, вы потерпите крах (если вам повезет).

1 голос
/ 15 декабря 2011

Вызов free по нулевому указателю - это нормально.

Вы не дали достаточно кода для полной диагностики этой проблемы, но несколько вещей, на которые следует обратить внимание:

  • Вам необходимо убедиться, что self.meshes[...].triangleArrays[...].faces всегда инициализируется либо путем вызова malloc (или еще чего-нибудь), либо путем установки его в NULL. В противном случае это может быть (и, вероятно, будет) случайный указатель мусора, к которому у вас нет разрешения на free.
  • Вы должны убедиться, что все различные self.meshes[...].triangleArrays[...].faces указатели являются различными указателями. Вы можете звонить free только один раз по указателю malloc. Например, что-то вроде этого:
    int * p = (int *) malloc(sizeof(int));
    free(p);
    free(p); // undefined behavior
    
    может вызвать сбой.
0 голосов
/ 15 декабря 2011

Как вообще был создан массив triangleArrays?Возможно ли, что невыделенные члены содержат мусор вместо NULL?

...