ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
7
記事: 473 登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:
#1
投稿記事
by 7 » 2006年4月13日(木) 20:32
以下のようにしたいのですが、問題はないでしょうか?
メモリを解放した後、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 » 2006年4月13日(木) 22:13
コード: 全て選択
Dim cCls As CHOGE
cCls=New CHOGE
Delete cCls
cCls=0'ここ
この cCls は *CHOGE でしょうか。
どれも代入したものを解放して後は不要になっているので、問題はないんじゃないかと思います。
OverTaker
記事: 231 登録日時: 2005年5月31日(火) 17:14
お住まい: 茨城県
#3
投稿記事
by OverTaker » 2006年4月13日(木) 22:45
細かいですが、気になったので指摘しておきます。
どれも代入したものを解放して後は不要になっているので、問題はないんじゃないかと思います。
ポインタ型変数に、データを示すアドレスが代入されているわけで、解放すると、データを示すアドレスが不要になるからだと思います。
7
記事: 473 登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:
#4
投稿記事
by 7 » 2006年4月13日(木) 23:00
どれも代入したものを解放して後は不要になっているので、問題はないんじゃないかと思います。
ポインタ型変数に、データを示すアドレスが代入されているわけで、解放すると、データを示すアドレスが不要になるからだと思います。
解放してもどんなデータかは分かりませんが、アドレスを示してるので 0 にはしちゃいけないのかと思ってました。
0 を代入しても問題なさそうですね。
Toshiさん、OverTakerさん、ありがとうございました。
osi
#5
投稿記事
by osi » 2006年4月15日(土) 17:03
> どれも代入したものを解放して後は不要になっているので、問題はないんじゃないかと思います。
でも、解放したって事は他で再利用されてる可能性もあるわけで、そこにアクセスするのはまずいんじゃない?
Toshi
記事: 98 登録日時: 2005年7月19日(火) 19:47
お住まい: 山形県
連絡する:
#6
投稿記事
by Toshi » 2006年4月15日(土) 17:23
OverTakerさんが仰っている通り、
不要になっているのは代入されたポインタやハンドルで、
一度それらを解放すれば、後はそれらを代入していた変数に別な値を代入しても
いいんじゃないか、ということです。
もちろん既に解放されたポインタが指すところへアクセスするのはまずいでしょう。
言葉が不足していました。
7
記事: 473 登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:
#7
投稿記事
by 7 » 2006年4月16日(日) 12:16
でも、解放したって事は他で再利用されてる可能性もあるわけで、そこにアクセスするのはまずいんじゃない?
不要になっているのは代入されたポインタやハンドルで、
一度それらを解放すれば、後はそれらを代入していた変数に別な値を代入しても
いいんじゃないか、ということです。
もちろん既に解放されたポインタが指すところへアクセスするのはまずいでしょう。
コード: 全て選択
Dim var As BytePtr
var=malloc(256)
'何らかの処理
free(var)
'var=0 'これはいい
'lstrcpy(var,0) 'これがだめ
ってことですよね...?
Toshi
記事: 98 登録日時: 2005年7月19日(火) 19:47
お住まい: 山形県
連絡する:
#8
投稿記事
by Toshi » 2006年4月16日(日) 12:34
そういうことですね。
ポインタ型の変数は単なるポインタの受け皿のようなものでしょうから。
7
記事: 473 登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:
#9
投稿記事
by 7 » 2006年4月16日(日) 12:53
> ポインタ型の変数は単なるポインタの受け皿のようなものでしょうから。
なるほど。また少しポインタの概念に詳しくなったような気がします。
レスポンスくれた方、ありがとうございました。
MH35
記事: 24 登録日時: 2006年3月09日(木) 17:09
連絡する:
#10
投稿記事
by MH35 » 2006年4月18日(火) 20:47
私が推測する限り、ポインタに0を代入する理由を探したところ、
解放した事を明示するためという結論しか出なかったのですが、
それでよろしいのでしょうか。C++ではスマートポインタを扱うとき
内部でこれをよくやるのですが。
MH35
記事: 24 登録日時: 2006年3月09日(木) 17:09
連絡する:
#11
投稿記事
by MH35 » 2006年4月18日(火) 20:48
私が推測する限り、ポインタに0を代入する理由を探したところ、
解放した事を明示するためという結論しか出なかったのですが、
それでよろしいのでしょうか。C++ではスマートポインタを扱うとき
内部でこれをよくやるのですが。
7
記事: 473 登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:
#12
投稿記事
by 7 » 2006年4月18日(火) 21:56
> 私が推測する限り、ポインタに0を代入する理由を探したところ、
> 解放した事を明示するためという結論しか出なかったのですが、
> それでよろしいのでしょうか。C++ではスマートポインタを扱うとき
> 内部でこれをよくやるのですが。
そうです。解放した事を明示的にするために 0 を代入したい、と思った時にアドレス示してるけど 0 を代入してもいいんだろうか?ってことで質問しました。
K&R
#13
投稿記事
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.
7
記事: 473 登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:
#14
投稿記事
by 7 » 2006年4月19日(水) 18:25
> Null pointer, isn't it? It, however, is not necessarily zero (0) by definition.
K&Rからの引用でしょうか...?英語はほとんど分かりません...。
解放したことを明示的にしたいと思った理由は下のようなコードを書いた時です。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします] コード: 全て選択
Class CBytePtr
Protected
c_lpString As BytePtr
c_stSize As SIZE_T
Public
Sub alloc(ByVal stSize As SIZE_T)
c_stSize=stSize
c_lpString=malloc(getSize())
End Sub
Sub release()
free(c_lpString)
'0 を代入して未使用だということを明示的にする
c_lpString=0
End Sub
Function getSize() As SIZE_T
getSize=c_stSize
End Function
Function isAlloc() As BOOL
isAlloc=FALSE
'free()の後に 0 を代入しないとfree()した後でもTRUEが返ってしまう
If c_lpString Then
isAlloc=TRUE
End If
End Function
End Class
イグトランス
記事: 899 登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:
#15
投稿記事
by イグトランス » 2006年4月19日(水) 18:37
> 解放した事を明示的にするために 0 を代入したい、と思った時にアドレス示してるけど 0 を代入してもいいんだろうか?ってことで質問しました。
まったく問題ありません。
7さんが提示されたようなコードのようなことをするのも、
ポインタに0を代入するということの使い道の1つです。
K&Rさんの英文は「ヌルポインタは0と定義されている」というようなことが書かれています。
C言語ではポインタの0をどんなオブジェクトを指して(ポイントして)いないということで、
ヌルポインタ (null pointer)と呼びます。(ABにもNULLという定数がありますよね)