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

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 解放したメモリに0を代入

レスが一人歩きしてる気がしますが・・・

by OverTaker » 2006年5月01日(月) 23:34

そういう理由なら、別に0を代入する必要は無いのでは?
人により考えは違いますが、バグを減らす有効な手段だと思います。
一般論として、0を代入する理由があるにはあるけど、それは、
・情報漏洩防止。
なるほど、情報漏洩防止ですか。確かに、そのようなこともありそうですね。

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

by 河川屋 » 2006年5月01日(月) 23:04

> 私が推測する限り、ポインタに0を代入する理由を探したところ、
> 解放した事を明示するためという結論しか出なかったのですが、
> それでよろしいのでしょうか。
そういう理由なら、別に0を代入する必要は無いのでは?
一般論として、0を代入する理由があるにはあるけど、それは、
・情報漏洩防止。
つまり、メモリーを開放すると、他プログラムがらアクセスできるわけで、他プログラムが
スパイウェアだったら???

したがって、ポインタに0を代入するのではなくて、データにゼロを代入しないとやる意味がないし、
ゼロを代入してから開放であって、開放してからゼロを入れるのはOSによりブロックされる
(ブロックされないような組みかたが可能としても、ウィルスワクチンのような特殊な場合以外避けるべき)
のでは?

by Rogue » 2006年4月20日(木) 00:09

> > 僕は「ヌルポは(必ずしも)ゼロでなくでもよさげじゃない?」みたいに解釈しました。
> たしかにそうですね。すいません。(英語力の無さがばれる……)
>
> > 以上は、C言語に関する話です。ABではどうなっているのでしょうか。
> ABのヌルポインタに関する規定は勿論わかりませんが、おそらく何も無いと思います。
> けれどWindowsでは0がヌルポインタですから、今のところ特に問題は無いといったところです。
> Cではコンパイル後がどうであれ、ソースコード上では常に0をヌルポインタとすることになっていますよね。

NULL(ヌル/ナル)とは元々の意味は「0」とか「無い」とか「無効」という意味
です。

http://dic.yahoo.co.jp/bin/dsearch?inde ... &pagenum=1
http://dic.yahoo.co.jp/bin/dsearch?p=nu ... &dname=1ss

で、初期化されていないメモリ領域に書き込むことは危険なので絶対にしては
いけません。
(強制終了することが多く、しない場合もありますがその場合は余計に危険)

ポインタ変数自体に数値を代入するのは結果的に指し示しているポインタ先を
書き換えているだけなのでOKです。

# ポインタ変数はポインタ変数用のメモリ領域が別に確保されています。
# なので、ポインタ変数(メモリ領域)へのポインタというのもあります。

メモリを動的確保した場合にmalloc()などが返すのは確保したメモリ領域の
ポインタで、このポインタは結局はただの数値に過ぎません。
(型は違いますが)
なので、この数値をポインタ変数に代入することでそのポインタ先を参照する
ことができるわけです。

# malloc()が&H12345678という数値を返してきた場合は&H12345678がその
# メモリ領域の先頭アドレスです。
# 0を代入した場合は指し示しているポインタが0なだけです。

あと、動的確保したメモリ領域がある場合、それを解放する際にアドレスが
必要になるので解放する前に書き換えることはしない方がいいです。
(その場合は別の変数にアドレスを一時的に退避させるとか...)

って、余計に分かりづらくなったかも。

by イグトランス » 2006年4月19日(水) 22:15

> 僕は「ヌルポは(必ずしも)ゼロでなくでもよさげじゃない?」みたいに解釈しました。
たしかにそうですね。すいません。(英語力の無さがばれる……)

> 以上は、C言語に関する話です。ABではどうなっているのでしょうか。
ABのヌルポインタに関する規定は勿論わかりませんが、おそらく何も無いと思います。
けれどWindowsでは0がヌルポインタですから、今のところ特に問題は無いといったところです。
Cではコンパイル後がどうであれ、ソースコード上では常に0をヌルポインタとすることになっていますよね。

by tak » 2006年4月19日(水) 20:42

話の本筋とはあまり関係しないのですが、補足です。

> > Null pointer, isn't it? It, however, is not necessarily zero (0) by definition.
> K&Rさんの英文は「ヌルポインタは0と定義されている」というようなことが書かれています。
僕は「ヌルポは(必ずしも)ゼロでなくでもよさげじゃない?」みたいに解釈しました。

それで調査してみると、C言語ではそういうことになっているようです。
(つまり「(必ずしも)ゼロでなくでもよさげ」なわけです。)
実際に NULL != 0 な処理系に出会ったことはありませんが、その辺は主としてハードウェアの都合に左右されるようです。
以上は、C言語に関する話です。ABではどうなっているのでしょうか。

> ヌルポインタ (null pointer)と呼びます。(ABにもNULLという定数がありますよね)
その NULL ですが、実は api_system.sbp 内で定義されています。
このことから Win32 API に対応するために必要で定義されたものであり、従来の(C言語の)ヌルポとしての意味は強くないと考えています。
単に NULL = 0 という定数が存在すれば問題ないのでしょう。(蛇足:TRUE, FALSE もこのファイルで定義されています。)

ただし「解放した事を明示的にするために 0 を代入」することは立派なC言語の慣習ですので、これに倣うことは悪くないと思います。

by イグトランス » 2006年4月19日(水) 18:37

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

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

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

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

by 7 » 2006年4月19日(水) 18:25

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

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

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

by K&R » 2006年4月19日(水) 06:30

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

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

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

by 7 » 2006年4月18日(火) 21:56

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

0を代入したい理由は?

by MH35 » 2006年4月18日(火) 20:48

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

0を代入したい理由は?

by MH35 » 2006年4月18日(火) 20:47

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

by 7 » 2006年4月16日(日) 12:53

> ポインタ型の変数は単なるポインタの受け皿のようなものでしょうから。
なるほど。また少しポインタの概念に詳しくなったような気がします。
レスポンスくれた方、ありがとうございました。

by Toshi » 2006年4月16日(日) 12:34

そういうことですね。
ポインタ型の変数は単なるポインタの受け皿のようなものでしょうから。

by 7 » 2006年4月16日(日) 12:16

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

コード: 全て選択

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

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

by Toshi » 2006年4月15日(土) 17:23

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

ページトップ