長時間実行すると「アクセス違反」で断続的にクラッシュするプログラムがあります。デバッグしたところ、非常に奇妙な現象に遭遇しました。
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
がコピーされます。割り当てはうまくいきます。vec1
STLが からのデータで新しく割り当てられたメモリを埋めようとすると、コピー プロセスでクラッシュが発生しますvec2
。さらに奇妙なのは、そのコピー プロセスの一部が適切に実行され、そのプロセスの途中でクラッシュが発生することです。
私の質問は、新しく割り当てられたメモリブロックを「部分的に」書き込み不可にするにはどうすればよいですか? ありがとうございました。
編集:皆さん、このコードに問題があるとは言いません-確かに問題はありません。なぜそのようなタイプのコードがクラッシュするのでしょうか? つまり、プログラムの他の部分は、STL によって新しく割り当てられたメモリ ブロックをどのように変更できますか? そして、そのようなメモリ破損をどのようにデバッグできますか?
はい、これが実際のコードです
追加:ページ ヒープを有効にして、このコードが実行される前に問題が発生したかどうかを確認しました。それは何もキャッチしませんでした。