投稿日 | : 2005/05/13(Fri) 14:11 |
投稿者 | : フレ |
URL | : |
タイトル | : メソッドの戻り値を配列にするとメモリリークする? |
こんにちは。フレと申します。
クラスモジュールの Public メソッドの
戻り値を配列にするとメモリ使用量が
どんどん増えていくという事象が発生しています。
【環境】
OS : Windows2000 SP4
IDE : VB6 SP6
【質問】
Project1 という名前で 標準 EXE の
プロジェクトを作成し、
Form1 という名前でフォームモジュールを作成しました。
また、Project2 という名前の ActiveX DLL プロジェクトを作成し、
Class1(Instancing:6-GlobalMultiUse) という名前の
クラスモジュールを作成しました。
Project2.Class1 には
以下のメソッドを実装しました。
<Project2.Class1 に実装したメソッド>
Public Function getByteArray() As Byte()
Dim bytArray(0 To 100) As Byte
getByteArray = bytArray
End Function
ここまで準備して、
Project1.From1 にボタンを設け、
ボタンクリックイベントで
Project2.Class1 の getByteArray() を
コールすると、メモリが開放されずに
どんどんメモリ使用量が増えていきます。
Private Sub Command1_Click()
Dim i As Long
For i = 1 To CLng(500000)
Call Project2.getByteArray
Next i
End Sub
なお、Project2.Class1 の getByteArray() を
Project1 の標準モジュールの関数として
コピペしてコールした場合は
メモリ使用量は蓄積されないようです。
標準 Exe 以外の ActiveX DLL などのメソッドでは
戻り値を配列にしてはいけないなどの
ルールがあるのでしょうか?
※VB歴1年程度ですが、このような話を
聞いたことがなかったので(^^;)
戻り値で配列を返さずに
ByRef の引数で配列を受け取って
処理を行うように変更することで
本問題を解決できることはわかりましたが、
既に作成してしまっているメソッドについては
簡単にメソッドのシグネチャを変更できない状況で、
どうしようか悩んでいます。
関連する情報などご存知の方がいらっしゃったら
教えてください。
以上です。
よろしくお願いします。