トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     同じ変数やレジスターに連続的にNewしてメモリーリークが起きるか(結果:起きない)
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
Fla4man
Åê¹ÆNo.20921
投稿日時: 2005-10-19 14:41
職人
居住地: かまくら
投稿: 517
使用環境:
WinMe,Win2000,
Flash4,アズさん,大仏、delphi
同じ変数やレジスターに連続的にNewしてメモリーリークが起きるか(結果:起きない)
Flash8で行列演算関係がネイティブになって
polarとか特にガシガシ使おうと思ったのですが(Flash8はもってないけど)
一つ気になることがありました。
質問しようと思ったのですが
自分で確認できそうなのでそれなりにやってみました。

それはFlash8の行列関数は結構NewmethodでPoint変数を新規生成するものが多いので
ちゃんと開放しないでおなじ変数名を使ってしまうと
最後に作ったオブジェクトだけが開放されて
オブジェクト(レコード)そのものメモリーが残ってしまうのでは無いかということです
最適化されたプログラミング言語の場合は大抵Freeとかdisposeか
自動開放用に親コンポーネントに登録とかするので釈然としなかったのです。

明示的な変数ならまだしも
特に私のように最初からレジスターだけ使ってやるような場合
どうなのだろうか。特にそこが気がかりでした。

テストはhtmltextにAタグでfunction Test1を呼び出し
そこで基本となるPointとmatrixを作っておいて

setintervalで0.1s間隔でfunction2 Test2を呼び出すというもので

呼び出されTest2側は
Push 'matrix'
getbariable
setregister r:2
pop
Push 'Point1'
getbariable
push 1,r:2,'transformPoint'
callmethod
setregister r:4
pop
//
//Asでいうと
//Point2=matrix.tarnsformPoint(Point1)
//
のあとに

Push 0.017453,1,r:2,'rotate'
callmethod
pop
//matrix.rotate(2π/360)

push r:4,1,r:2,'transformPoint'
callmethod
setregister r:4
pop
//Point2=matrix.tarnsformPoint(Point2)//同じところに生成

を8回繰り返すというものです。
繰り返した後動的に生成したテキストボックスに
ループカウントと(r:4).'x'を表示させました。
xの値は回転を繰り返してから再代入していないのであまり意味は無いです。

監視はタスクマネージャーのIEのメモリ使用量を見ています。
もしも開放忘れがあると一回のループで
最低でも'x'と'y'の2つの変数分の8倍で64byteは消費するはずで
最初ドンドン増えていたのでギョッとしたのですが
40ループで1kbyteふえるはずが
setintervalの回数が20000回を越えても変化はなかったので
開放されていると判断しました。

同じ変数にNewmethodで割り当てても
いらんくなったオブジェクトはおのおのスコープがはずれた段階で
自動的に開放されるから
ちょっとずつ動かして代入する演算とかも
geomのPoint生成系関数に対して不必要に変数を用意する必要は無い
とわかり安心した次第です。


----------------
通常のハンドル名:×○○× ねた回収モードに突入 現在1/100

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops