4

私は2つのコマンドライン引数を取るプログラムを書いています:aそしてbそれぞれ。

すべてが良い限りa <= 17.5

a > 17.5プログラムが次のエラーをスローするとすぐに:

解放されたオブジェクトのチェックサムが正しくありません-オブジェクトは解放された後に変更された可能性があります

問題を次のコードに絞り込みました。

for(int a=0; a < viBrickWall.size(); a++) {
    vector<int64_t> viTmp(iK-i);
    fill(viTmp.begin(),viTmp.end(),2);

    for(int b = 0; b < viBrickWall[a].size(); b++) {
         viTmp[viBrickWall[a][b]] = 3;
    }

    viResult.push_back(viTmp);
    viTmp.clear();
}

後者のコードを削除すると、エラーがなくなります。

また、valgrindを使用してメモリをデバッグしていますが、解決策を見つけることができませんでした。

これはvalgrindのレポートのコピーです:

Pastebinでホストされているレポート

編集

デバッグフラグを使用してプログラムをコンパイルしました。

g++ -g -O0 -fno-inline program.cpp

次のようにvalgrindで実行しました。

`valgrind --leak-check = full --show-reachable = yes --dsymutil = yes ./a.out 48 10 ``

私は次の行に気づきました:

 ==15318== Invalid write of size 8
 ==15318==    at 0x100001719: iTileBricks(int) (test.cpp:74)
 ==15318==    by 0x100001D7D: main (test.cpp:40)

74行目は次のとおりです。

viTmp[viBrickWall[a][b]] = 3;

40行目は次のとおりです。

viBrickWall = iTileBricks(iPanelWidth);

4

1 に答える 1

3

次の行を使用して、ヒープメモリへの無効な書き込みを引き起こしています。

viTmp[viBrickWall[a][b]] = 3;

これは、その時点でviBrickWall[a][b]外部でインデックスを作成していることを意味します。viTmp追加

int i = viBrickWall[a][b];
assert(0 <= i && i < viTmp.size());

店の前にviTmp[i] = 3

ヒント:viTmpのサイズを1つ増やすと、修正される可能性があります。

-vector<int64_t> viTmp(iK-i);
+vector<int64_t> viTmp(iK - i + 1);

内容がわからないviBrickWallので、これはValgrindの出力からの知識に基づいた推測にすぎません。

libstdc++GNUを使用しているのかlibc++MacOSXを使用しているのかわかりません。libstdc++Linuxボックスを使用している、または手元にある場合は、この問題をすばやく解決viTmpできると宣言してください。std::__debug::vector

于 2012-11-18T12:34:23.767 に答える