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
書き忘れていました
VB6.0での話です
> それとも、確保されたメモリの領域は、それを参照する変数がなくなる
> まで保持されているのでしょうか?
ですます。どこからも参照されなくなった後、変数のスコープが有効範囲外になった時点で開放されます。
魔界の仮面弁士さん。返答ありがとうございました。
オブジェクトと同じような扱いなんですね。
書いてから思いついたんですが。
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の内容が
コピーされるという処理が暗黙のうちに行われているみたいです。
もしかして関数の戻り値も、それと同じようにコピーされているんじゃ
ないかなとも考えたりしました。
すみません。解決を付け忘れました。
編集 削除