ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 19:26

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 
作成者 メッセージ
 記事の件名: deleteしたときに0代入
投稿記事Posted: 2006年6月06日(火) 10:44 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
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した後のオブジェクトポインタの活用方法は私の知る限り一つも見当たりませんが、何か弊害などありそうだと思う方、ご意見いただけると助かります。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月06日(火) 17:35 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
やるならDeleteだけでなく、freeも引数をByRefにして、
そのDeleteと同じように0を代入するようにしてほしいです。

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


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月06日(火) 19:15 
オフライン

登録日時: 2006年3月01日(水) 13:54
記事: 10
ただそれだと、Delete時に0が代入される前提でプログラムが書かれ、トラブルの元になることもあるかもしれません。

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


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月06日(火) 22:28 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
それだったら、VarPtr(_System_Invalid_Pointer)でなくとも&hcccccccc As VoidPtrなどで十分だと思います。
#或いはdeadbeefやabadcafeも乙なものです。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月09日(金) 23:27 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
やはり0を強制的に代入していても、複数のポインタ変数にコピーしている場合、すべてが0にならないなどの不具合が生じるのかもしれませんね。

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

結局のところ、

delete pObj
pObj=0

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

delete pObj=0

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


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[12人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean