1

以下のコードピースの2番目と3番目のステートメントを実行しているときに、Pageheapによってアプリケーションが強制的にクラッシュすることを期待していました。しかし、これは起こっていません。アプリケーションのフルページヒープを有効にしました。

2番目と3番目のステートメントでアプリケーションを壊すためにページヒープを作成するには、どのような追加の操作を行う必要がありますか?

char *test =new char[12];
memset(test,'c',15);
test[13] = 'c';

しかし、私が使用する場合、次のステートメントのページブレークは私のアプリケーションを壊します

memset(test,'c',50);
4

1 に答える 1

2

割り当てはNバイトに切り上げられます。ここで、Nは8の倍数であり、使用しているWindowsのバージョンによって異なります。この場合、割り当てが最も近い8バイトに切り上げられると仮定します。

Pageheapは、各割り当ての最後に「ガードページ」を挿入し、読み取り/書き込みアクセスから保護することで機能するため、Pageheapを使用しようとすると、アクセス違反が発生します。

この場合、の割り当てtestは12バイトを要求しています。ヒープマネージャは実際には16バイトの割り当てを提供しています。アクセスtest[15]はこの割り当ての範囲内であるため、ガードページに到達していません。

もう1つの注意点として、ページヒープ全体が、割り当てによって返される「余分な」メモリを特別な値で満たすと思います。割り当てを解放すると、「余分な」メモリがチェックされ、値が変更された場合は例外が発生します。

于 2011-05-08T11:12:54.643 に答える