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

解決


ゆう  2004-05-27 06:40:32  No: 83576

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-27 07:20:16  No: 83577

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


魔界の仮面弁士  2004-05-27 07:38:08  No: 83578

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

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


ゆう  2004-05-27 07:48:49  No: 83579

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

書いてから思いついたんですが。
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-27 07:57:35  No: 83580

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加