動的配列の保持期間はいつまで?

解決


ゆう  2004-05-26 21:40:32  No: 83576  IP: [192.*.*.*]

VBの仕様についての質問です。

下記のようにプロシージャ内で宣言した配列を返り値とするような関数を
作ったのですが、プロシージャ内で確保したメモリにもかかわらず
その呼び出し元でも今のところアクセス違反ともならず使用できています。

VBの仕様上下記のようなメモリ確保のしかたはまずいのでしょうか。
それとも、確保されたメモリの領域は、それを参照する変数がなくなる
まで保持されているのでしょうか?

Private Sub TestProc()
  Dim bytA() as Byte

  bytA()=TestFunc(100)  '配列確保関数呼び出し
End Sub

Private Function TestFunc( nSize as Long ) as Byte()
  Dim bytOut() as Byte

  ReDim bytOut(nSize-1)
  TestFunc = bytOut
End Function

編集 削除
ゆう  2004-05-26 22:20:16  No: 83577  IP: [192.*.*.*]

書き忘れていました
VB6.0での話です

編集 削除
魔界の仮面弁士  2004-05-26 22:38:08  No: 83578  IP: [192.*.*.*]

> それとも、確保されたメモリの領域は、それを参照する変数がなくなる
> まで保持されているのでしょうか?

ですます。どこからも参照されなくなった後、変数のスコープが有効範囲外になった時点で開放されます。

編集 削除
ゆう  2004-05-26 22:48:49  No: 83579  IP: [192.*.*.*]

魔界の仮面弁士さん。返答ありがとうございました。
オブジェクトと同じような扱いなんですね。

書いてから思いついたんですが。
Dim A() As Byte
Dim B() As Byte

ReDim A(9)
A(0)=1
B=A
Debug.Print A(0),B(0)
B(0)=2
Debug.Print A(0),B(0)

とすると最初のDebug.PrintではA(0)=B(0)ですが、次のDebug.Printでは
1と2になっていることから、Bには新しくメモリが確保されてAの内容が
コピーされるという処理が暗黙のうちに行われているみたいです。

もしかして関数の戻り値も、それと同じようにコピーされているんじゃ
ないかなとも考えたりしました。

編集 削除
ゆう  2004-05-26 22:57:35  No: 83580  IP: [192.*.*.*]

すみません。解決を付け忘れました。

編集 削除