ошибка отладки при освобождении памяти - PullRequest
0 голосов
/ 18 марта 2012

Цель приведенного ниже кода - исправить ложное значение (-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.

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

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

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;
}

Ответы [ 2 ]

2 голосов
/ 18 марта 2012

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

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()];

Убедитесь, что вы проверили, что .from и .to являются = 0, в противном случае вы выполняете запись вне выделенного массива кучи, что может привести к повреждению кучи.

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

std::vector<int> code

0 голосов
/ 18 марта 2012

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

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чтобы получить неопределенные значения, что не является вашей проблемой, но подозрительно ...

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