2012-03-18 2 views
0

Цель нижеследующего кода - исправить ложное значение (-1) до правого значения, но когда я использую динамический массив для записи правильного значения, происходит ошибка отладки. Кто-нибудь может мне помочь? Благодарю.ошибка отладки при выполнении освобождения памяти

code.cpp

int size = DFS_CODE.size(); 
int *code = new int[DFS_CODE.size()]; 

for(int i = 0; i < DFS_CODE.size(); i++) { 
    if(DFS_CODE[i].fromlabel == -1) 
     DFS_CODE[i].fromlabel = code[DFS_CODE[i].from]; 
    else if(DFS_CODE[i].tolabel == -1) 
     DFS_CODE[i].tolabel = code[DFS_CODE[i].to]; 

    code[DFS_CODE[i].from] = DFS_CODE[i].fromlabel; 
    code[DFS_CODE[i].to] = DFS_CODE[i].tolabel; 

    cout << DFS_CODE[i].from << "(" << DFS_CODE[i].fromlabel << ") => " 
     << DFS_CODE[i].to << "(" << DFS_CODE[i].tolabel << ")" << endl; 
} 
delete [] code; 

отлаживать ошибка

debug error! 
HEAP CORRUPTION DETECTED:after Normal block(#1363) at 0x005745F0. 
CRT detected that the application wrote to memory after end of heap buffer. 

Я нашел ошибку отладки также будет происходить, когда я использую таНос. Когда я возьму delete [] code; или free(code);, произойдет ошибка отладки. Зачем? не следует ли освобождать память?

Я решаю эту проблему по-другому, я использую структуру map, чтобы сохранить правильное значение. Спасибо всем, кто мне помогает! С наилучшими пожеланиями!

map <int, int> code; 

for(int i = 0; i < DFS_CODE.size(); i++) { 
    if(DFS_CODE[i].fromlabel != -1) 
     code[DFS_CODE[i].from] = DFS_CODE[i].fromlabel; 
    if(DFS_CODE[i].tolabel != -1) 
     code[DFS_CODE[i].to] = DFS_CODE[i].tolabel; 

    cout << DFS_CODE[i].from << "(" << code[DFS_CODE[i].from] << ") => " 
     << DFS_CODE[i].to << "(" << code[DFS_CODE[i].to] << ")" << endl; 
} 
+1

Каковы возможные значения для 'from' и' to' в 'DFS_CODE' размера n? – fredoverflow

+0

Я уверен, что это значение правильно. Проблема возникает, когда я использую код 'delete [];' – LoveTW

+2

Проблема возникает, когда вы используете delete [] или бесплатно, потому что раньше вы разложили кучу. В какой-то момент вы записываете данные за пределы вашего массива «code», тем самым изменяя следующие/предыдущие указатели в блоках кучи. Это не имеет никакого отношения к delete [] или бесплатному. – mfontanini

ответ

2

Подозрительно мне эти строки

code[DFS_CODE[i].from] = DFS_CODE[i].fromlabel; 
code[DFS_CODE[i].to] = DFS_CODE[i].tolabel; 

Как вы распределяете код следующим

int *code = new int[DFS_CODE.size()]; 

Убедитесь, что вы убедитесь, что .От и .то являются < DFS_CODE.size() и> = 0, иначе вы пишете вне своего массива, выделенного кучей, который может вызвать повреждение кучи.

Кроме того, есть причина, вы не замените массив code полностью с

std::vector<int> code 

?

+0

Я очень уверен, что указанное вами условие не существует в моем коде. Я нашел, если я возьму 'delete [] code;' out, ошибка исчезнет. Но я не знаю, почему. Спасибо за ваш ответ :) – LoveTW

+0

@ Mrmr часто обнаружение повреждения кучи происходит при распределении/освобождении памяти (когда куча фактически управляется), а не в доступе к памяти. –

+0

Так что мне не нужно использовать 'delete [] code;'? – LoveTW

0

Обратите внимание, что при выделении памяти для «кода» он не инициализируется

int *code = new int[DFS_CODE.size()]; 

И ниже код использует его ...

for(int i = 0; i < DFS_CODE.size(); i++) { 
    if(DFS_CODE[i].fromlabel == -1) 
        DFS_CODE[i].fromlabel = code[DFS_CODE[i].from]; 
    else if(DFS_CODE[i].tolabel == -1) 
        DFS_CODE[i].tolabel = code[DFS_CODE[i].to]; 

Это может быть причиной DFS_CODE получить неопределенную значения, что не является вашей проблемой, но является подозрительным ...

+0

Даже я инициализирую «код», проблема все еще происходит. И смешно то, что если взять 'delete [] code;' out, проблема будет решена ..., но я думаю, что не выпускать память - это не очень хорошая идея, поэтому я решаю эту проблему, используя 'map' состав. Спасибо за вашу помощь:) – LoveTW

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