2017-04-12 10 views
1

私のマシンでこのコードを見てください。エラーは発生しませんが、VirtualAllocより多くのバイトをコピーできますか?CopyMemoryについては、VirtualAllocよりも多くのバイトをコピーしました。

PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,3,MEM_COMMIT,PAGE_READWRITE); 
    BYTE FlagThree[] = {'a', 'b', 'c', 'd','e','f','g'}; 
    CopyMemory(pNewBuffer,FlagThree,sizeof(FlagThree)); 

私は3バイトを割り当てますが、メモリには7バイトを割り当てます。

+0

番号は未定義です。 –

+0

"それは安全です"とはどういう意味ですか?クラッシュしないことが保証されているかどうか尋ねていますか? –

+0

はい、テスト後、クラッシュしないようですが、この文が許可されているかどうかわかりません.VirtualAllocの2番目のパラメータの意味は何ですか:私はこのパラメータに任意の数値を使用できますか? – yangl

答えて

2

VirtualAllocは割り当てを最も近い割り当て境界まで丸めます。したがって、3バイトを要求しているにもかかわらず、割り当ての粒度は64Kであるため、実際にはより多くを割り当てます。

これにより、要求した3バイト以上を書き込むことができます。ただし、コメントに記載されているように、これは未定義の動作であり、実行しないでください。

2

これは未定義の動作ではありません。実際には、ドキュメントは明示的に「lpAddressパラメータがNULLの場合、この値(dwSize)は次のページ境界に切り上げられます」ということが完全に定義されています。

ページサイズを超えるまではかなり安全です。

0

この記事への他の回答(丸め)はこの特定のケースではまったく正しいものですが、C++が定義されていない振る舞いを理解していると考えるべきです。

C++の他の状況では、JavaやC#などと違って、何か「悪い」を実行すると、すぐにクラッシュすることはありませんが、奇妙な方法で誤動作する可能性があります。または、期待どおりに実行してください。それだけで何が起こるのかは定義されていません。読んでください。

関連する問題