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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

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

#1 投稿記事 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'ここ
Toshi
記事: 98
登録日時: 2005年7月19日(火) 19:47
お住まい: 山形県
連絡する:

#2 投稿記事 by Toshi »

コード: 全て選択

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

どれも代入したものを解放して後は不要になっているので、問題はないんじゃないかと思います。
OverTaker
記事: 231
登録日時: 2005年5月31日(火) 17:14
お住まい: 茨城県

#3 投稿記事 by OverTaker »

細かいですが、気になったので指摘しておきます。
どれも代入したものを解放して後は不要になっているので、問題はないんじゃないかと思います。
ポインタ型変数に、データを示すアドレスが代入されているわけで、解放すると、データを示すアドレスが不要になるからだと思います。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#4 投稿記事 by 7 »

どれも代入したものを解放して後は不要になっているので、問題はないんじゃないかと思います。
ポインタ型変数に、データを示すアドレスが代入されているわけで、解放すると、データを示すアドレスが不要になるからだと思います。
解放してもどんなデータかは分かりませんが、アドレスを示してるので 0 にはしちゃいけないのかと思ってました。

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

#5 投稿記事 by osi »

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

でも、解放したって事は他で再利用されてる可能性もあるわけで、そこにアクセスするのはまずいんじゃない?
Toshi
記事: 98
登録日時: 2005年7月19日(火) 19:47
お住まい: 山形県
連絡する:

#6 投稿記事 by Toshi »

OverTakerさんが仰っている通り、
不要になっているのは代入されたポインタやハンドルで、
一度それらを解放すれば、後はそれらを代入していた変数に別な値を代入しても
いいんじゃないか、ということです。
もちろん既に解放されたポインタが指すところへアクセスするのはまずいでしょう。
言葉が不足していました。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#7 投稿記事 by 7 »

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

コード: 全て選択

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

	'var=0	'これはいい
	'lstrcpy(var,0)	'これがだめ
ってことですよね...?
Toshi
記事: 98
登録日時: 2005年7月19日(火) 19:47
お住まい: 山形県
連絡する:

#8 投稿記事 by Toshi »

そういうことですね。
ポインタ型の変数は単なるポインタの受け皿のようなものでしょうから。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#9 投稿記事 by 7 »

> ポインタ型の変数は単なるポインタの受け皿のようなものでしょうから。
なるほど。また少しポインタの概念に詳しくなったような気がします。
レスポンスくれた方、ありがとうございました。
MH35
記事: 24
登録日時: 2006年3月09日(木) 17:09
連絡する:

0を代入したい理由は?

#10 投稿記事 by MH35 »

私が推測する限り、ポインタに0を代入する理由を探したところ、
解放した事を明示するためという結論しか出なかったのですが、
それでよろしいのでしょうか。C++ではスマートポインタを扱うとき
内部でこれをよくやるのですが。
MH35
記事: 24
登録日時: 2006年3月09日(木) 17:09
連絡する:

0を代入したい理由は?

#11 投稿記事 by MH35 »

私が推測する限り、ポインタに0を代入する理由を探したところ、
解放した事を明示するためという結論しか出なかったのですが、
それでよろしいのでしょうか。C++ではスマートポインタを扱うとき
内部でこれをよくやるのですが。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

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

#12 投稿記事 by 7 »

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

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

#13 投稿記事 by K&R »

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

Null pointer, isn't it? It, however, is not necessarily zero (0) by definition.
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

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

#14 投稿記事 by 7 »

> Null pointer, isn't it? It, however, is not necessarily zero (0) by definition.
K&Rからの引用でしょうか...?英語はほとんど分かりません...。

解放したことを明示的にしたいと思った理由は下のようなコードを書いた時です。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#15 投稿記事 by イグトランス »

> 解放した事を明示的にするために 0 を代入したい、と思った時にアドレス示してるけど 0 を代入してもいいんだろうか?ってことで質問しました。

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

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