私は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のレポートのコピーです:
編集
デバッグフラグを使用してプログラムをコンパイルしました。
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);