1. ホーム
  2. c

[解決済み】malloc():メモリ破壊

2022-02-09 05:32:34

質問内容

以下は、このエラーが発生する可能性があると思われる簡易的なプログラムです。

char *p = (char*)malloc(8192);
for(int i = 0; i < 9200; ++i){
  p[i] = '1';
}
char *s = (char*)malloc(strlen(p)); 

元のプロジェクトはかなり複雑なので、簡略化しました。8192バイトをmallocで代入しました。そして、8192文字以上の文字を配列に書き込むようにしました。そこで、mallocを使ってメモリを確保する。

このミニプログラムはクラッシュしませんでした。しかし、元の大きなプロジェクトでは、このエラーでクラッシュしてしまいます。

malloc(): メモリー破損。0x0000000007d20bd0**

この差の原因は何でしょうか?

解決方法は?

<ブロッククオート

この差の原因は何でしょうか?

基本的に、メモリアロケータが割り当てるのは ページ を一度に使用し、その中でポインタを与えます(次の領域が使用可能であることを確認します)。これらのページは通常8KiBより大きいので、あなたのミニプログラムでは問題はありません。しかし、より大きなプログラムがより大きなメモリを割り当て、割り当てられたスペースの終わりを越えてどんどん書き込んでいくと、未割り当てのメモリ(または他のプログラムが使用しているメモリ!)に書き込もうとすることになり、メモリを破壊してしまうことになります。