• ベストアンサー

VB6のメモリ解放に関して

お世話になります VB6のメモリ解放に関して、以下を参考に下記のコードで試したのですが、 コンパイルエラーで「配列には割り当てられません」となってしまいます。 http://okwave.jp/qa/q3372573.html 違いは宣言の型がStringかLongしかないと思うのですが、 なにが悪いのか教えていただけないでしょうか ******* 以下 ソース Dim wProcDat() As Long ReDim wProcDat(1 To 1000, 1 To 768) 中略 Set wProcDat = Nothing

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

そもそも、配列型変数にNothingをセットすることはできません。 質問文にまさしく書かれているとおり。 たぶんに、q3372573に嵌められただけかと。

usami33
質問者

お礼

回答ありがとうございます。 やはり嵌められたんですね。 態々時間をかけて試して損してしまいました。

その他の回答 (3)

  • ap_2
  • ベストアンサー率64% (70/109)
回答No.4

#補足にすぎませんが NothingはObjectの場合だけですね。配列はErase()で初期化します。 EraseでDim時の状態に戻ります。静的配列でもできます。 そして・・・ VB6やVBAの場合、ガベージコレクションが自動的にメモリを解放してくれるので、明示的にメモリ解放する必要はあまりナイかと。解放する癖つけた方がいいのは確かですが。 ------ ・Eraseしなくても解放されます → 関数を抜ける時に未使用のメモリが解放されるため、メモリリークの心配はほとんどありません。 ・Eraseしても即解放されるわけではない → ガベージコレクション対象にセットされるだけで、たいていは関数抜ける時解放されるみたいです。結局メモリ使用量減りません(※)。 ------ リンク先はそーいうコト(※)かと。MsgBoxでメモリ増えるとか謎ですし、MsgBox表示でプログラム止まる際にガベージコレクション走りそうですが・・・バージョンによる違いなのかな。。。

usami33
質問者

お礼

回答ありがとうございます。 Eraseの使用方法は判っているつもりで、 Nothingでもできる記述があったので試していたところなんです。

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.3

失礼しました。 エラーの発生箇所は Set wProcDat = Nothing ですね。 下記によると動的配列には Erase を使うようです。 http://www.moug.net/tech/acvba/0050008.html 下記のプログラムを作ってみました。 Dim wProcDat() As Long ReDim wProcDat(1 To 1000, 1 To 768) wProcDat(1000, 768) = 999 wProcDat(1, 1) = 888 MsgBox wProcDat(1000, 768) Erase wProcDat MsgBox "Erase" MsgBox wProcDat(1, 1) 最後のMsgBoxでインデックスが有効範囲に入りませんから、開放されているようです。

usami33
質問者

お礼

回答ありがとうございます。 Eraseの使用方法は判っているつもりで、 Nothingでもできる記述があったので試していたところなんです。

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.1

> Dim wProcDat() As Long これは一次元配列 > ReDim wProcDat(1 To 1000, 1 To 768) これは二次元配列ですね。 Dim wProcDat(1,1) As Long としてもエラーになりますか?

usami33
質問者

補足

(1,1)にしても同じエラーになりました。 2次元配列はNGなんですかね?

関連するQ&A

  • メモリの解放について VB6 VBA

    VB6やVBAで動的配列をERASEしたのですが、タスクマネージャーで見ても使っているメモリを解放しているように見えません。 動的配列の内容をMsgBoxで表示させるたびにメモリがどんどん減っていきます。Eraseしても戻りません。 Redim ArryaDat(0)とかでも無理でした。 APIを使って(どんな方法)でも、メモリを解放したいのですが、可能でしょうか? Dim ArrayDat() as String Redim ArrayDat(100) ArrayDat(0) = "なんとか" ArrayDat(1) = "かんとか" ... ArrayDat(100) = "メモリを解放したい" for i = LBound(ArrayDat) to UBound(ArrayDat) MsgBox("どんどんメモリが消費されていく・・ [" & ArrayDat(i) & "]") next i Redim ArrayDat(0) Erase ArrayDat NsgBox("解放したつもり? 誰か教えて") あと、.NETではメモリ解放はどうなっているのでしょうか? まだ使いませんが、頭の片隅に入れておきたいです。

  • dim を解放

    VBスクリプト です。 DIMで宣言された変数を解放するにはどうすればいいでしょうか? DIM myfilename myfilename="ああああああ" このときmyfilenameには「ああああああ」が入っていますが、これを空。初期状態に戻すにはどうすればいいでしょうか? redim filename としたら()がないとか言われてエラーでした。 ()つけてもエラーでしたけど。 今 http://www.okweb.ne.jp/kotaeru.php3?q=281720 の疑問を解決しようとVBスクリプトで作成していきづまってるところです。

  • VB6でポインタ?

    VB6でポインタを扱う関数 VarPtrがあるのですが、使えるデータ型は何があるのでしょうか? 仕様なのか、動的配列のポインタが取得できません。 dim kosuu() as integer redim kosuu(50) dim pointer as long pointer = VarPtr( kosuu() ) 'エラー VB6でポインタを扱う場面は例えばどんな場合があるか知りたいです。 ポインタは使わない(使ってはいけない)のが基本でしょうか。

  • VB 配列

    今,VBでテキストファイルを読込み配列に入れるという作業を書いたのですが,うまくいきません. 初回例外が発生してしまいます.配列は文字列の配列になります. どなたかご教示のほどよろしくお願いいたします. 'ファイルの読込み Dim path1 As String = "C:\Users\aleph_H.S\Desktop\気象台データインポートツール\気象台データインポートツール\" Dim path2 As String = "気象台データリスト.txt" Dim Mypath As String = path1 + path2 ' StreamReader の新しいインスタンスを生成する Dim cReader As New System.IO.StreamReader(Mypath, System.Text.Encoding.Default) ' 読み込んだ結果をすべて格納するための変数を宣言する Dim stResult As String = String.Empty Dim matrix(,) As String Dim ic As Long = 0 Dim icc As Long = 0 ReDim Preserve matrix(80, 3) ' 読み込みできる文字がなくなるまで繰り返す While (cReader.Peek() >= 0) ' ファイルを 1 行ずつ読み込む Dim stBuffer As String = cReader.ReadLine() ' 読み込んだものを追加で格納する stResult &= stBuffer & System.Environment.NewLine ic = ic + 1 'カンマ区切りで分割して配列に格納する Dim stArrayData As String() = stResult.Split(","c) For Each sstData In stArrayData icc = icc + 1 '文字列をInteger型に変換 matrix(ic - 1, icc - 1) = sstData Next End While cReader.Close()

  • VB6-標準モジュールとの変数の受け渡し

    VB6の初心者です。ごく初歩的な問題でお恥ずかしいのですが困っています。 標準モジュール内にある以下のサブルーチンを行わせるために、 Sub Transform(NumSamples As Long, RealIn() As Double, ImageIn() As Double, RealOut() As Double, ImagOut() As Double, Optional InverseTransform As Boolean = False) (NumSamples、RealIn()、ImageIn()は入力値) (RealOut()、ImagOut()は戻り値) ... ... End Sub フォームモジュール内で以下のようにコールすると、 Private Sub cmdStart_Click() Dim A as Long Dim B(10000) as Double Dim C(10000) as Double Dim D(10000) as Double Dim E(10000) as Double ... (A,B,Cに数値入力) ... Call Transform(A, B(), C(), D(), E(), False) End Sub で実行すると、変数D()に対して「コンパイルエラー:型が一致しません:配列またはユーザ定義型を指定してください」が出ます。なお、配列は10000まで宣言していますが実際には0~4096を使っています。 変数型は合わせているはずなのになぜエラーになるのでしょうか。D(),E()の型宣言をPublicにして標準モジュール内に入れたり、いろいろやってみたつもりですがうまくいきません。 よろしくお願いします。

  • VB2010 コンパイルエラー

    VB6からVB2010への移行を行うにあたり、 VB6→VB2008→VB2010 のコンバートを行いました。 が、以下のソースがコンバートされてコンパイルエラーになってしまいます。 エラー内容: 型 'System.Windows.Forms.Cursor' の値を 'Integer' に変換できません。 ---(1)元のソース------------------ Dim lSv_Mouse As Long 'マウスポインタ状態の保存 lSv_Mouse = Screen.MousePointer (中略) 'マウスポインタ状態の復元 Screen.MousePointer = lSv_Mouse ---------------------------------- ---(2)コンバート後のソース--------- Dim lSv_Mouse As Integer 'マウスポインタ状態の保存 lSv_Mouse = System.Windows.Forms.Cursor.Current (中略) 'マウスポインタ状態の復元 System.Windows.Forms.Cursor.Current = lSv_Mouse ---------------------------------- 何か良い方法は無いでしょうか?

  • VBの配列 IsNull, IsNuthing, ...? 用途がわかりません。

    以下の場合、(1)で範囲エラーとなります。 redim a(0)とすると、a配列に1個データがあるということで、for文が実行されますが。 Redimしないまま(データが無い意味としたいので)で、このFor文をパスするには、どのように記述すればよいのでしょうか? dim a() as string '----->(2) for i=LBound(a) to UBound(a) '---->(1) msgbox(a(i)) next i

  • VB.NETで、配列をテーブルに変換する。

    VB.NETで、一次元配列string()にあるデータを、DataTableに変換 したいのですが、「型'String'の値を'System,Data,DataTable'に変換できません。」 と、エラーが発生してしまいます。 s1に、配列データが入っています。 Dim dt As DataTable Dim cnt As Integer Dim i As Integer dt = New DataTable count = s1.Length For i = 0 To cnt - 1 dt = CType(s1(i), DataTable) Next 解決方法が見つからず、行き詰っております。 宜しくお願い致します。

  • ExcelのVBAでメモリ解放できない

    以下のようなプログラムで、ExcelVBAで作成しております、Webの情報を取得しております。 strGetUrl のところのサイトによっては、メモリが解放できず困っています。 Whileで繰り返すほど、メモリを消費して解放されません。メモリいっぱいになれば解放してくれるのかと思いましたが、止まってしまいました。2回目はOSを壊して再インストールしてもらいました(VPS上で)。 困っております。オブジェクトも”Set xxxx = Nothing”で解放しているつもりです。 考えられる理由をご教授頂けると幸いです。 環境は OSはWindowsServer2008R2 IEはIE8 でVPSなので変更不可と言われました。 ちなみに、Windows8.1の環境ではメモリが溜まっていくことはなかったです。 何か良い方法はありますでしょうか? また、別のWebアクセス方法はありますでしょうか? IE = CreateObject("InternetExplorer.Application")は同じ結果でした。 以下のプログラムでサイトにもよりますが、発生しています。 *********************************** Option Explicit Sub testHtml() Dim doc As Object, objTag1 As Object, objTag2 As Object Dim oHttp As Object Dim strUrl As String, strGetUrl As String Dim rowIndex As Integer ' 基本URL設定 strGetUrl = "http://www.xxxx.xxx.com" rowIndex = 1 '1列目が1行づつ進めてが空になったら終了 While Cells(rowIndex, 1).Value <> "" Set oHttp = CreateObject("MSXML2.XMLHTTP") Set doc = CreateObject("htmlfile") ' *************** HTTPヘッダの作成し、送信してデータを取得 ***************** With oHttp .Open "GET", strGetUrl, False .Send ' 受信したデータをオブジェクトに書き込みます。 doc.Write .responseText End With ' *************** 受信データを解析し、H2データ取得に分割 ***************** For Each objTag1 In doc.body.getElementsByTagName("H2") If objTag1.className = "resultCount" Then Cells(rowIndex, 2).Value = objTag1.innerText End If Next ' Objectの解放 Set objTag1 = Nothing Set objTag2 = Nothing Set doc = Nothing Set oHttp = Nothing rowIndex = rowIndex + 1 Wend End Sub

  • VB6.0の参照渡し

    VC++6.0で作成したDLLへVBの配列を渡そうと思っています。 いくつかためしたのですが、 「配列引数は ByRef でなければなりません。」 というエラーがでてしまいます。 標準モジュール内の記述 Declare Function fncTest Lib "Test.dll" (ByRef test() As Long) As Long フォーム内 Private Sub Test_Click() dim test() as Long dim i as integer for i = 0 to 3 test(i) = i next i fncTest(Test()) End Sub とりあえず、こんな形でかいてみましたが、 Sub内のtest()の宣言方法、使用法等ご指導お願いします。

専門家に質問してみよう