deleteしたときに0代入

返信する


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

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

トピックのレビュー
   

展開ビュー トピックのレビュー: deleteしたときに0代入

by 山本 » 2006年6月09日(金) 23:27

やはり0を強制的に代入していても、複数のポインタ変数にコピーしている場合、すべてが0にならないなどの不具合が生じるのかもしれませんね。

"Dim _System_Invalid_Pointer As Byte" の手法もよさそうですが、"If pObj Then" のような表記ができなくなってしまいますね。これも困りもんです…。

結局のところ、

delete pObj
pObj=0

とやるとバグが少なくなっていいですよ~と促す程度が良いのでしょうか??となると、

delete pObj=0

なんて表記を許してしまって、こちらを推奨するのもありかも…。

by イグトランス » 2006年6月06日(火) 22:28

それだったら、VarPtr(_System_Invalid_Pointer)でなくとも&hcccccccc As VoidPtrなどで十分だと思います。
#或いはdeadbeefやabadcafeも乙なものです。

by xsb7 » 2006年6月06日(火) 19:15

ただそれだと、Delete時に0が代入される前提でプログラムが書かれ、トラブルの元になることもあるかもしれません。

デバッグ時に、Dim _System_Invalid_Pointer As Byte を宣言し、メモリ開放時には VarPtr(_System_Invalid_Pointer) を代入してポインタの無効化を行えば、0の代入が前提とされる恐れもなく、いいのではないでしょうか。

by イグトランス » 2006年6月06日(火) 17:35

やるならDeleteだけでなく、freeも引数をByRefにして、
そのDeleteと同じように0を代入するようにしてほしいです。

問題があるとしたら、それはオーバーヘッドが生じることでしょうが、
リリース時にはオプションでこの機能を使わないようにすることができれば文句無いと思います。

deleteしたときに0代入

by 山本 » 2006年6月06日(火) 10:44

newしたオブジェクトをdeleteした後、そのオブジェクトに不正にアクセスしてしまうミス、経験された方はいらっしゃいますでしょうか。

メモリ管理の関係で、deleteした後はそのオブジェクトポインタ変数が指し示すメモリの内容は不明瞭なものになります。よって、アクセスすると場合によって強制終了してしまうという、デバッグが非常に困難な問題になりかねません。

例えば、下記のようなケースがこの問題に当てはまります。

コード: 全て選択


Class CTest
	a As Long
End Class

Dim pobj As *CTest
pobj=New CTest
'何らかの処理
delete pobj

'コードミスにより、不正なメンバにアクセス
pobj->a=10

このような場合には、確実に例外を発生させたいのです。
そこで、Ver5.0からはdeleteのときに自動的に0を代入してやるのはどうかと考えているのですが、いかがでしょうか。

deleteした後のオブジェクトポインタの活用方法は私の知る限り一つも見当たりませんが、何か弊害などありそうだと思う方、ご意見いただけると助かります。

ページトップ