2015-01-13 4 views
1

Я студент, и сейчас я пытаюсь выполнить задачу в C.C: Где я должен освобождать свои указатели?

Я написал алгоритм, который работает до сих пор. Он получает файл, чтобы определить, является ли включенное логическое выражение выполнимым (SAT-Solver). Проблема в том, что через некоторое время я получаю ошибку Segementation Fault, когда я пытаюсь использовать ее с большими файлами (около 60 МБ). Я думаю, что это так, потому что я использую malloc пару раз, но я еще не освобождаю эту память, потому что я не знаю, куда помещать бесплатные() выражения.

Существует один метод, который называет себя дважды каждый раз. Код выглядит следующим образом:

int DPLL (int *pointer, int variablen, int anzahlklauseln) 
{ 
int newliteral; 
int neueklauseln; 
int *neuphi; 
int *neuphi2; 
int *unitclauses; 
int *pureliterals; 
int offsetzaehler; 
int rek1, rek2; 

klauseln = anzahlklauseln; 
unitclauses = (int *) malloc(klauseln * sizeof(int)); 
pureliterals = (int *) malloc(variablen * sizeof(int)); 

if (isEmpty()) 
{ 
    return 1; 

} 

if (ContainsEmptyClause(pointer, variablen)) 
{ 
    return 0; 
} 

unitClauses(pointer, variablen, unitclauses); 
if (unsatisfiable) 
{ 
    unsatisfiable = 0; 
    return 0; 
} 

int iunitclauses = 0; 
while (unitclauses[iunitclauses] != 0) 
{ 
    unitPropagate(pointer, variablen, unitclauses[iunitclauses++]); 
} 

if (quicksati(pointer, variablen)) 
{ 
    return 1; 
} 

pureLiterals(pointer, variablen, pureliterals); 

int ipureliterals = 0; 
while (pureliterals[ipureliterals] != 0) 
{ 
    pureLiteralAssign(pointer, variablen, pureliterals[ipureliterals++]); 
} 

if (quicksati(pointer, variablen)) 
{ 
    return 1; 
} 

newliteral = chooseliteral(pointer, variablen); 

neuphi = (int*) malloc(variablen * (klauseln + 1) * sizeof(int)); 
neuphi2 = (int*) malloc(variablen * (klauseln + 1) * sizeof(int)); 

int *hilfspointer = pointer; 

offsetzaehler = 0; 
for (int i = 0; i < (klauseln +1); ++i) 
{ 
    for (int j = 0; j < variablen; ++j) 
    { 
     if (i == klauseln) 
     { 
      neuphi[offsetzaehler] = 0; 
      neuphi2[offsetzaehler] = 0; 
     } 
     else 
     { 
      neuphi[offsetzaehler] = *hilfspointer; 
      neuphi2[offsetzaehler++] = *hilfspointer++; 
     } 
    } 
} 

neueklauseln = klauseln + 1; 

addClause(neuphi, variablen, newliteral); 
addClause(neuphi2, variablen, (-newliteral)); 

if (DPLL(neuphi, variablen, neueklauseln)) 
{ 
    return 1; 
} 
else 
{ 
    return DPLL(neuphi2, variablen, neueklauseln); 
} 
} 

Теперь я думал, что я должен править последние строки, как это:

rek1 = DPLL(neuphi, variablen, neueklauseln); 
rek2 = DPLL(neuphi2, variablen, neueklauseln); 

free(neuphi); 
free(neuphi2); 
free(unitclauses); 
free(pureliterals); 

return rek1 || rek2; 

Но тогда я получаю ошибки ошибки сегментации для файлов, которые работали раньше.

Тогда я попробовал это так:

if (DPLL(neuphi, variablen, neueklauseln)) 
{ 
    return 1; 
} 
else 
{ 
    free(neuphi); 
    free(unitclauses); 
    free(pureliterals); 
    rek1 = DPLL(neuphi2, variablen, neueklauseln); 
    free(neuphi2); 
    return rek1; 
} 

Но тогда я хотел бы получить еще больше Сегментация разломы.

Итак, какие-нибудь эксперты C, которые хотели бы мне помочь? Большое спасибо! :)

+0

Отсутствие 'free''s не вызовет« ошибки сегментации », предположим, что вам нужны все эти данные сразу, почему вы бы назвали' free'? Вы должны называть 'free', когда вам это больше не нужно. В коде есть что-то не так: вы не проверяете успех «malloc», но я не думаю, что это причина «сегментационной ошибки», хотя это может быть и одно. –

+0

Сколько раз вы оцениваете 'DPLL', чтобы называть себя? это может быть проблемой. –

+0

Есть ли в «волшебной магии» какая-то магия, чтобы вернуться из функции? –

ответ

1

У вашей рекурсии нет условия выхода, поэтому программа столкнется с ошибкой сегментации, когда она столкнется с переполнением стека или когда ваш вызов malloc возвращает нулевой указатель, как следствие, из-за нехватки памяти кучи, что бы ни случилось первым.

+1

должен быть значок для правильного использования переполнения стека в ответе на переполнение стека. –

Смежные вопросы