-4

長時間実行すると「アクセス違反」で断続的にクラッシュするプログラムがあります。デバッグしたところ、非常に奇妙な現象に遭遇しました。

std::vectorプログラムは、次のように別のコードに代入 (コピー) するコードでクラッシュします。

struct Data
{
int int1;
int int2;
}
//vec1 is empty
//vec2 contains a couple of thousands Data structs 
std::vector<struct Data> vec1 = vec2;//**crash happens here**

何が起こるかは単純です - STL が にメモリ ブロックを割り当て、そこvec1からのデータvec2がコピーされます。割り当てはうまくいきます。vec1STLが からのデータで新しく割り当てられたメモリを埋めようとすると、コピー プロセスでクラッシュが発生しますvec2。さらに奇妙なのは、そのコピー プロセスの一部が適切に実行され、そのプロセスの途中でクラッシュが発生することです。

私の質問は、新しく割り当てられたメモリブロックを「部分的に」書き込み不可にするにはどうすればよいですか? ありがとうございました。

編集:皆さん、このコードに問題があるとは言いません-確かに問題はありません。なぜそのようなタイプのコードがクラッシュするのでしょうか? つまり、プログラムの他の部分は、STL によって新しく割り当てられたメモリ ブロックをどのように変更できますか? そして、そのようなメモリ破損をどのようにデバッグできますか?

はい、これが実際のコードです

追加:ページ ヒープを有効にして、このコードが実行される前に問題が発生したかどうかを確認しました。それは何もキャッチしませんでした。

4

1 に答える 1

0

OK 原因は不適切な同期であることがわかりました。つまり、初期化プロセスvec2中にセカンダリ スレッドから変更されました。vec1元の投稿のベクトル割り当てに対応する STL コードは次のとおりです。

if (_Buy(_Right.size())) 
    _Mylast = _Ucopy(_Right._Myfirst, _Right._Mylast, _Myfirst);

1 行目で新しいベクターにメモリを割り当て、2 行目でコンテンツをコピーします。

何が起こっていたかというと、最初の行が完了した後 (およびメモリが割り当てられた後)、ベクトルが外部スレッドから変更され、そのサイズが増加しました。そのため、2 行目は、割り当てられたメモリ サイズよりも多くの要素をコピーしようとしていました。これにより、アクセス違反が発生しました。

于 2013-02-17T17:40:25.250 に答える