deleteしたときに0代入

今の言語仕様やライブラリはココが足りないんじゃ…、エディタや周辺ツールにこんな機能が必要なのでは…!?このような要望、具体的な提案などがありましたら、こちらのフォーラムをご活用ください。
返信する
メッセージ
作成者
山本
Site Admin
記事: 535
登録日時: 2005年5月30日(月) 15:08
連絡する:

deleteしたときに0代入

#1 投稿記事 by 山本 »

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した後のオブジェクトポインタの活用方法は私の知る限り一つも見当たりませんが、何か弊害などありそうだと思う方、ご意見いただけると助かります。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

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

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

問題があるとしたら、それはオーバーヘッドが生じることでしょうが、
リリース時にはオプションでこの機能を使わないようにすることができれば文句無いと思います。
xsb7
記事: 10
登録日時: 2006年3月01日(水) 13:54
連絡する:

#3 投稿記事 by xsb7 »

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

デバッグ時に、Dim _System_Invalid_Pointer As Byte を宣言し、メモリ開放時には VarPtr(_System_Invalid_Pointer) を代入してポインタの無効化を行えば、0の代入が前提とされる恐れもなく、いいのではないでしょうか。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

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

それだったら、VarPtr(_System_Invalid_Pointer)でなくとも&hcccccccc As VoidPtrなどで十分だと思います。
#或いはdeadbeefやabadcafeも乙なものです。
山本
Site Admin
記事: 535
登録日時: 2005年5月30日(月) 15:08
連絡する:

#5 投稿記事 by 山本 »

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

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

結局のところ、

delete pObj
pObj=0

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

delete pObj=0

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