ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 11:36

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




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - deleteしたときに0代入
作成者 メッセージ
  記事の件名:   引用付きで返信する
やはり0を強制的に代入していても、複数のポインタ変数にコピーしている場合、すべてが0にならないなどの不具合が生じるのかもしれませんね。

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

結局のところ、

delete pObj
pObj=0

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

delete pObj=0

なんて表記を許してしまって、こちらを推奨するのもありかも…。
投稿記事 Posted: 2006年6月09日(金) 23:27
  記事の件名:   引用付きで返信する
それだったら、VarPtr(_System_Invalid_Pointer)でなくとも&hcccccccc As VoidPtrなどで十分だと思います。
#或いはdeadbeefやabadcafeも乙なものです。
投稿記事 Posted: 2006年6月06日(火) 22:28
  記事の件名:   引用付きで返信する
ただそれだと、Delete時に0が代入される前提でプログラムが書かれ、トラブルの元になることもあるかもしれません。

デバッグ時に、Dim _System_Invalid_Pointer As Byte を宣言し、メモリ開放時には VarPtr(_System_Invalid_Pointer) を代入してポインタの無効化を行えば、0の代入が前提とされる恐れもなく、いいのではないでしょうか。
投稿記事 Posted: 2006年6月06日(火) 19:15
  記事の件名:   引用付きで返信する
やるならDeleteだけでなく、freeも引数をByRefにして、
そのDeleteと同じように0を代入するようにしてほしいです。

問題があるとしたら、それはオーバーヘッドが生じることでしょうが、
リリース時にはオプションでこの機能を使わないようにすることができれば文句無いと思います。
投稿記事 Posted: 2006年6月06日(火) 17:35
  記事の件名:  deleteしたときに0代入  引用付きで返信する
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日(火) 10:44

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


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