VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 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 の引数で配列を受け取って
処理を行うように変更することで
本問題を解決できることはわかりましたが、
既に作成してしまっているメソッドについては
簡単にメソッドのシグネチャを変更できない状況で、
どうしようか悩んでいます。

関連する情報などご存知の方がいらっしゃったら
教えてください。

以上です。
よろしくお願いします。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -