メモリの解放について – プログラミング – Home

通知
すべてクリア

メモリの解放について


山田★靖
 山田★靖
(@山田★靖)
ゲスト
結合: 22年前
投稿: 24
Topic starter  

いつもお世話になっております。

メモリ解放時の質問なのですが、下記のコードで
メモリ確保、解放処理しています。そこでTestMemory()
を2回目に呼び出したときに、メモリ解放処理が行われ
るのですが、そこで例外が発生します。
(Damege After NormalBlock とか表示されています。)

解放処理に間違いはないと思うのですが・・・
アドバイスお願い致します。

---------------------------------------------
// グローバル変数定義
BYTE* pData =NULL;

void TestDlg::TestMemory()
{
// メモリ解放
if( pData != NULL)
{
delete[] pData;
pData = NULL;

}
// メモリ取得
pData = new BYTE[sizeof(ある構造体)];
]
---------------------------------------------


引用解決済
トピックタグ
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

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;
}


返信引用
山田★靖
 山田★靖
(@山田★靖)
ゲスト
結合: 22年前
投稿: 24
Topic starter  

範囲外書き込みというのは、確保したメモリの範囲外
ということですよね?
実際の処理ではメモリに書き込みしているので、ちょっと
調べてみます。


返信引用
山田★靖
 山田★靖
(@山田★靖)
ゲスト
結合: 22年前
投稿: 24
Topic starter  

ちょっと、調べてたのですが
Damege After NormalBlockが発生したアドレスは

pData = new BYTE[sizeof(ある構造体)];
pDataに格納されている先頭アドレスでした・・・
もう少し調べてみます。


返信引用
山田★靖
 山田★靖
(@山田★靖)
ゲスト
結合: 22年前
投稿: 24
Topic starter  

たびたび、すみません。
メモリ中身を見たところ、1552バイト分メモリを
確保しているのですが、実際に確保している領域は
1545バイト分でした・・・7バイト分は範囲外なのに
書き込みしているから、例外が発生したという事に
なるのですかね・・・

new で設定しているサイズに間違いはないのですが・・・


返信引用
ku
 ku
(@ku)
ゲスト
結合: 25年前
投稿: 312
 

> 実際に確保している領域は1545バイト分でした
これはどうやって確認しました?

int n = sizeof(ある構造体);
などとやって、とりあえずsizeofが返す値を調べてみるとか

> new で設定しているサイズに間違いはないのですが・・・
new BYTE[1552];
とやったのに確保された領域のサイズが1545バイトということは通常ならあり得ません
確保できなければエラーとしてくれないと困りますからね


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました