メモリ関係のエラー

解決


hiky  2006-03-28 19:59:43  No: 61049  IP: 192.*.*.*

VS2003でプログラムをつくっています。
MFCでつくっているのですが
Test_Image  = new BYTE [256*256];(コンストラクタ)
とメモリ確保して
Test_Image = dlg.Cut_Image;
image_draw_8(pDC,Test_Image,256,256,700,200);(ビットマップ表示用の自作関数)
で一度表示させます。その後別の関数内で
image_draw_8
を使用してTest_Imageを表示させようとすると
"〜〜〜〜でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x011a8000 を読み込み中にアクセス違反が発生しました"というエラーがでます。別関数で呼ばれたときに変数の中身が変わってしまっているようなのですがどう対処すればよいでしょうか?

編集 削除
YuO  2006-03-28 20:04:36  No: 61050  IP: 192.*.*.*

> Test_Image  = new BYTE [256*256];(コンストラクタ)
> とメモリ確保して
> Test_Image = dlg.Cut_Image;

確保したメモリへのポインタを上書きしていますが,問題ないのですか?
# おそらく,ここが問題かと。

編集 削除
hiky  2006-03-28 20:14:17  No: 61051  IP: 192.*.*.*

レスありがとうございます。
> Test_Image  = new BYTE [256*256];(コンストラクタ)
をはずしてやってみたのですが
 Test_Image = dlg.Cut_Image;
をしている関数をでるときにも同じようなエラーがでてしまいます。

編集 削除
hiky  2006-03-28 20:45:25  No: 61052  IP: 192.*.*.*

まちがえました。コンストラクタでメモリ確保せずに
Test_Image = dlg.Cut_Image;
image_draw_8(pDC,Test_Image,256,256,700,200);(ビットマップ表示用の自作関数)
で一度表示させて別の関数内で
image_draw_8
を使用してTest_Imageを表示させようとしてもTest_Imageにアクセスするときに同じエラーがでます。よろしくお願いします。

編集 削除
YuO  2006-03-28 21:54:02  No: 61053  IP: 192.*.*.*

そもそも,dlg.Cut_Imageって何ですか?

Test_Image = dlg.Cut_Image;
の方が間違いではないかと思うのですが。


というか,ちゃんとデバッガ使ってデバッグしましょう……。

編集 削除
hiky  2006-03-29 10:21:58  No: 61054  IP: 192.*.*.*

ダイアログをだすクラスを用意していてそこでpublicで宣言した配列です。
すいませんまだプログラム初心者なもので。。。。恥ずかしながらデバッガの使い方もよくわからないのです。

編集 削除
YuO  2006-03-29 10:38:15  No: 61055  IP: 192.*.*.*

> ダイアログをだすクラスを用意していてそこでpublicで宣言した配列です。

その配列には,十分な領域が確保されているのですか?

とりあえず……
・何のためにTest_Image = new BYTE [256*256];としたのか
・何のためにTest_Image = dlg.Cut_Image;としたのか
をちゃんと考えるみるのがよいかと。


> すいませんまだプログラム初心者なもので。。。。恥ずかしながらデバッガの使い方もよくわからないのです。

デバッガの使用方法を書き出したら,大変な量になってしまいますので,簡単に。

・実行はDebug構成で[デバッグ] - [実行]を使う
・事前にブレークポイントを設定しておく
・ブレークしたら変数(等)の値をウォッチしながらステップ実行

基本はこれだけです。
ちゃんとデバッガで実行していれば,
> "〜〜〜〜でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x011a8000 を読み込み中にアクセス違反が発生しました"
というダイアログは出ないはずです。
# IDEがアクセス違反例外を捕捉するから。

編集 削除
hiky  2006-03-29 13:50:02  No: 61056  IP: 192.*.*.*

ポインタでデータを渡すのをやめることで解決できました。
クラスのデストラクタのせいでポイントがさす場所がかわってしまっていたからだと考えています。ありがとうございました!

編集 削除
YuO  2006-03-29 18:29:41  No: 61057  IP: 192.*.*.*

「考えています」では解決できていないですよ。

私は,
・dlg.Cut_Imageの配列容量が65536より小さい
・image_draw_8の中で,65535より大きな値によるアクセスをしている
・image_draw_8の中で,0より小さい値によるアクセスをしている
のどれかが原因ではないかと疑っていたのですけどね。

編集 削除