ページ 12

解放したメモリに0を代入

Posted: 2006年4月13日(木) 20:32
by 7
以下のようにしたいのですが、問題はないでしょうか?
メモリを解放した後、0 を代入しています。

コード: 全て選択

Dim pStr As BytePtr
	pStr=malloc(256)
	free(pStr)
	pStr=0'ここ

Dim hBmp As HBITMAP
	hBmp=CreateCompatibleBitmap(hDC,640,480)
	DeleteObject(hBmp)
	hBmp=0'ここ

Dim pRc As *RECT
	pRc=calloc(SizeOf(RECT))
	free(pRc)
	pRc=0'ここ

Dim cCls As CHOGE
	cCls=New CHOGE
	Delete cCls
	cCls=0'ここ

Posted: 2006年4月13日(木) 22:13
by Toshi

コード: 全て選択

Dim cCls As CHOGE 
    cCls=New CHOGE 
    Delete cCls 
    cCls=0'ここ
この cCls は *CHOGE でしょうか。

どれも代入したものを解放して後は不要になっているので、問題はないんじゃないかと思います。

Posted: 2006年4月13日(木) 22:45
by OverTaker
細かいですが、気になったので指摘しておきます。
どれも代入したものを解放して後は不要になっているので、問題はないんじゃないかと思います。
ポインタ型変数に、データを示すアドレスが代入されているわけで、解放すると、データを示すアドレスが不要になるからだと思います。

Posted: 2006年4月13日(木) 23:00
by 7
どれも代入したものを解放して後は不要になっているので、問題はないんじゃないかと思います。
ポインタ型変数に、データを示すアドレスが代入されているわけで、解放すると、データを示すアドレスが不要になるからだと思います。
解放してもどんなデータかは分かりませんが、アドレスを示してるので 0 にはしちゃいけないのかと思ってました。

0 を代入しても問題なさそうですね。
Toshiさん、OverTakerさん、ありがとうございました。

Posted: 2006年4月15日(土) 17:03
by osi
> どれも代入したものを解放して後は不要になっているので、問題はないんじゃないかと思います。

でも、解放したって事は他で再利用されてる可能性もあるわけで、そこにアクセスするのはまずいんじゃない?

Posted: 2006年4月15日(土) 17:23
by Toshi
OverTakerさんが仰っている通り、
不要になっているのは代入されたポインタやハンドルで、
一度それらを解放すれば、後はそれらを代入していた変数に別な値を代入しても
いいんじゃないか、ということです。
もちろん既に解放されたポインタが指すところへアクセスするのはまずいでしょう。
言葉が不足していました。

Posted: 2006年4月16日(日) 12:16
by 7
でも、解放したって事は他で再利用されてる可能性もあるわけで、そこにアクセスするのはまずいんじゃない?
不要になっているのは代入されたポインタやハンドルで、
一度それらを解放すれば、後はそれらを代入していた変数に別な値を代入しても
いいんじゃないか、ということです。
もちろん既に解放されたポインタが指すところへアクセスするのはまずいでしょう。

コード: 全て選択

Dim var As BytePtr
	var=malloc(256)
	'何らかの処理
	free(var)

	'var=0	'これはいい
	'lstrcpy(var,0)	'これがだめ
ってことですよね...?

Posted: 2006年4月16日(日) 12:34
by Toshi
そういうことですね。
ポインタ型の変数は単なるポインタの受け皿のようなものでしょうから。

Posted: 2006年4月16日(日) 12:53
by 7
> ポインタ型の変数は単なるポインタの受け皿のようなものでしょうから。
なるほど。また少しポインタの概念に詳しくなったような気がします。
レスポンスくれた方、ありがとうございました。

0を代入したい理由は?

Posted: 2006年4月18日(火) 20:47
by MH35
私が推測する限り、ポインタに0を代入する理由を探したところ、
解放した事を明示するためという結論しか出なかったのですが、
それでよろしいのでしょうか。C++ではスマートポインタを扱うとき
内部でこれをよくやるのですが。

0を代入したい理由は?

Posted: 2006年4月18日(火) 20:48
by MH35
私が推測する限り、ポインタに0を代入する理由を探したところ、
解放した事を明示するためという結論しか出なかったのですが、
それでよろしいのでしょうか。C++ではスマートポインタを扱うとき
内部でこれをよくやるのですが。

Re: 0を代入したい理由は?

Posted: 2006年4月18日(火) 21:56
by 7
> 私が推測する限り、ポインタに0を代入する理由を探したところ、
> 解放した事を明示するためという結論しか出なかったのですが、
> それでよろしいのでしょうか。C++ではスマートポインタを扱うとき
> 内部でこれをよくやるのですが。
そうです。解放した事を明示的にするために 0 を代入したい、と思った時にアドレス示してるけど 0 を代入してもいいんだろうか?ってことで質問しました。

Re: 0を代入したい理由は?

Posted: 2006年4月19日(水) 06:30
by K&R
> > 私が推測する限り、ポインタに0を代入する理由を探したところ、
> > 解放した事を明示するためという結論しか出なかったのですが、
> > それでよろしいのでしょうか。C++ではスマートポインタを扱うとき
> > 内部でこれをよくやるのですが。
> そうです。解放した事を明示的にするために 0 を代入したい、と思った時にアドレス示してるけど 0 を代入してもいいんだろうか?ってことで質問しました。

Null pointer, isn't it? It, however, is not necessarily zero (0) by definition.

Re: 0を代入したい理由は?

Posted: 2006年4月19日(水) 18:25
by 7
> Null pointer, isn't it? It, however, is not necessarily zero (0) by definition.
K&Rからの引用でしょうか...?英語はほとんど分かりません...。

解放したことを明示的にしたいと思った理由は下のようなコードを書いた時です。

Posted: 2006年4月19日(水) 18:37
by イグトランス
> 解放した事を明示的にするために 0 を代入したい、と思った時にアドレス示してるけど 0 を代入してもいいんだろうか?ってことで質問しました。

まったく問題ありません。
7さんが提示されたようなコードのようなことをするのも、
ポインタに0を代入するということの使い道の1つです。

K&Rさんの英文は「ヌルポインタは0と定義されている」というようなことが書かれています。
C言語ではポインタの0をどんなオブジェクトを指して(ポイントして)いないということで、
ヌルポインタ (null pointer)と呼びます。(ABにもNULLという定数がありますよね)