いつもお世話になっております。
メモリ解放時の質問なのですが、下記のコードで
メモリ確保、解放処理しています。そこでTestMemory()
を2回目に呼び出したときに、メモリ解放処理が行われ
るのですが、そこで例外が発生します。
(Damege After NormalBlock とか表示されています。)
解放処理に間違いはないと思うのですが・・・
アドバイスお願い致します。
---------------------------------------------
// グローバル変数定義
BYTE* pData =NULL;
void TestDlg::TestMemory()
{
// メモリ解放
if( pData != NULL)
{
delete[] pData;
pData = NULL;
}
// メモリ取得
pData = new BYTE[sizeof(ある構造体)];
]
---------------------------------------------
1回目と2回目のTestMemory()の呼び出しの間に範囲外書き込みしてませんか?
例:
struct Foo { BYTE b[ 8 ]; };
BYTE* pData =NULL;
void TestMemory() { ... }
int APIENTRY WinMain( HINSTANCE,HINSTANCE,LPSTR,int )
{
TestMemory();
Foo* pFoo = reinterpret_cast<Foo*>( pData );
// ここでワザと範囲外書き込みすると、
pFoo->b[ 8 ] = 0u;
// この中のdelete[]で上のエラーが発生。
TestMemory();
return 0;
}
範囲外書き込みというのは、確保したメモリの範囲外
ということですよね?
実際の処理ではメモリに書き込みしているので、ちょっと
調べてみます。
ちょっと、調べてたのですが
Damege After NormalBlockが発生したアドレスは
pData = new BYTE[sizeof(ある構造体)];
pDataに格納されている先頭アドレスでした・・・
もう少し調べてみます。
たびたび、すみません。
メモリ中身を見たところ、1552バイト分メモリを
確保しているのですが、実際に確保している領域は
1545バイト分でした・・・7バイト分は範囲外なのに
書き込みしているから、例外が発生したという事に
なるのですかね・・・
new で設定しているサイズに間違いはないのですが・・・
> 実際に確保している領域は1545バイト分でした
これはどうやって確認しました?
int n = sizeof(ある構造体);
などとやって、とりあえずsizeofが返す値を調べてみるとか
> new で設定しているサイズに間違いはないのですが・・・
new BYTE[1552];
とやったのに確保された領域のサイズが1545バイトということは通常ならあり得ません
確保できなければエラーとしてくれないと困りますからね