2012-03-18 26 views
0

以下のコードの目的は、false値(-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構造体を使用します。私を助けるすべての人に感謝します!宜しくお願いします!私には不審な

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

'n 'の' DFS_CODE'で 'from'と' to'の値は何でしょうか? – fredoverflow

+0

私はこれらの価値が正しいと確信しています。問題は、私が 'delete [] code;;を使用したときに発生します。 – LoveTW

+2

以前にヒープを破損しているため、delete []またはfreeを使用すると問題が発生します。ある時点で、 "code"配列を超えてデータを書き込んでいるため、ヒープブロック内の次の/ prevポインタを変更します。これはdelete []やfreeとは関係ありません。 – 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()]; 

あなたはその.fromをチェックしていることを確認し、これらの線であり、< DFS_CODE.size .TOです0以上でなければ、ヒープの破損を引き起こす可能性のあるヒープ割り当て配列の外側に書き込んでいます。

また、その理由は、あなたが完全に

std::vector<int> code 

で配列codeを置き換えるものではありませんがありますか?あなたは「コード」のためにあなたのメモリを割り当てる際、それが

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

を初期化し、以下のコードは、これはDFS_CODEが未定義受信させることが可能...

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

を、それを使用していないことを

+0

私はあなたが言及している条件が私のコードに存在しないと確信しています。私が 'delete [] code;'をとった場合、エラーは消えます。しかし、私は理由を知らない。返信いただきありがとうございます:) – LoveTW

+0

@ Mr.mrヒープの破損の検出は、メモリ割り当てではなく、メモリ割り当て/解放(ヒープが実際に管理されている場合)で行われることがよくあります。 –

+0

私は 'delete [] code;'を使う必要はありません。 – LoveTW

0

注意値は、あなたの問題ではありませんが、疑わしいです...

+0

私は 'code'を初期化しても、問題はまだ発生します。そして、ばかげたことは、 'delete [] code;'を取り除くと問題が解決されるということです。しかし、メモリを解放しないと良い考えではないと思いますので、 'map'を使ってこの問題を解決します。構造。ご協力いただきありがとうございます:) – LoveTW