• 締切済み

メモリ解放について(ASP)

お世話になります。 VBscriptを利用したASPプログラムを作っています。 そこで、メモリ解放について質問があります。 set 変数 = nothingで解放を行おうとおもいますが、 これを使った方が良い変数(オブジェクト変数)と使っても意味がない、もしくは使ったらエラーになる変数というのは、何で判断すればよいのでしょうか? とりあえず、メモリリークを避けたいからすべての変数とオブジェクト変数をプログラムの最後で解放しようと思ったのですが、どうもエラーになる変数もあるようなので質問しました。

みんなの回答

  • msystem
  • ベストアンサー率42% (79/186)
回答No.2

>とりあえず、メモリリークを避けたいからすべての変数とオブジェクト変数をプログラムの最後で解放しようと思ったのですが、どうもエラーになる変数もあるようなので質問しました。 メモリリークを避ける面では、確実に開放するのが良いとは思いますが、VBの仕様で参照されなくなった(スコープを外れた)変数は開放されるというのがあります。これを利用するほうがトラブルはないのではないでしょうか? ただし、ActiveXオブジェクトなどは、その中でメモリーリークしている可能性がありますので、確実に開放するのが良いのではないでしょうか(それでもリークは残りますが)つまり、CreateObjectなどで作成されたものに対しては、きっちりと開放する。それ以外はVBに任せる。これならエラーはでないと思います。

noname#102878
noname#102878
回答No.1

うーん・・・ 「エラーになる変数もあるようなので」 ってわかっているならそれで体験的に作業すれば完成しちゃいませんか?

関連するQ&A

  • ASP.NET(C#)のメモリ解放について

    少し質問しづらいのですが、 ASP.NET(C#)でメモリ解放を行う場合、 ・変数 ・インスタンス ・セッション の3つを使い終わった後に、nullやRemoveしておけば、 そのうちガベージコレクションでメモリ解放されるのでしょうか。 他にも何か使い終わった後に処理しておかないといけない、 (データ接続などを閉じておくなど)

  • 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

  • 「オブジェクトの破棄」と「メモリの解放」は同じ意味

    「オブジェクトの破棄」と「メモリの解放」は同じ意味ですか? ********************************* Sub Sample1() Dim objIE As Object Dim buf As String Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "http://oshiete.goo.ne.jp/" Do While objIE.busy DoEvents Loop Do While objIE.Document.readyState <> "complete" DoEvents Loop Set objIE = Nothing End Sub ********************************* の場合の「Set objIE = Nothing」は、 「オブジェクトの破棄」でしょうか? 「メモリの解放」でしょうか? どちらでもありますか? ご回答よろしくお願いします。

  • メモリ解放が必要な場合

    基本的な質問です。mallocやreallocのときはfreeが必要といわれますが、ローカル変数でポインタ型の変数を宣言したときなどもfreeしてもいいのでしょうか?splintをかけるとmallocのように動的にメモリ確保してないのにメモリリークの可能性が。。。などとエラーがでてしまってどう対応したらよいか困っています。

  • 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

  • ASPのReDim Preserveについて

    いつもお世話になります。 ASP(VBScript)で教えて頂きたいことがあります。 VBScriptにはJavaでいうArrayListのようなコレクション機能がないので、動的配列を実現するためには ReDim PreserveやScripting.Dictionaryを使用しなければなりませんよね。 そこで、DBから取得したレコードを、ループする度毎にReDim Preserveを使用し、データをセットするよう な実装をしていました。すると、ReDim Preserveは問題があるのでやめた方がよい、と言われました。 具体的には、ReDim Preserveをすることによって、新たに配列を作成し、古い内容をコピーするため、 倍々にメモリを食いつぶしていくことになり、それが大きくなるとどんどん遅くなっていき、そしてメモリリーク になる、ということでした。 自分なりに調べてみたのですが、そのような記事を見つけることができませんでしたし、JavaのArrayList でも内部的には配列を持っており、配列の再作成などをやっています。 ○○百万件などといった大量件数を扱う際は、それはメモリリークにならないような設計、実装をしなければ ならないとは思うのですが、それはどの言語でも共通で言えることであって、特別にVBScriptではやめた方がよい、 とは思えません。 ReDim Preserveを使用しても、先に述べたような認識をもっていれば問題ないと思うのですが、どうでしょうか。 VBScriptは、こういう仕組みだから駄目なんだ、という理由があるのでしょうか。もしあれば、根拠となる サイトなど教えて頂けると嬉しいのですが。。。 宜しくお願い致します。

  • メモリの解放について

    メモリの解放について c#で、Mysqlへデータセットするプログラムを作っているのですが、登録する度にメモリが増加していきます。昔、VC++で同じようなプログラムを作成した時にも同現象が発生したので、SetProcessWorkingSetSize()を使って解決したのですが、c#では、解決する方法はあるのでしょうか? ご教授お願いいたします。

  • VBScriptでASPのオブジェクトを使う方法

    VBScriptでSQLサーバーのDBにアクセスするためASPのserverオブジェクト を使うと ランタイム エラーが発生しました。デバッグしますか? 行:39 エラー:オブジェクトがありません。:'server' とエラーが表示されます。 おそらく次の行だと思うのですが、何か方法を教えてください。 set objDB = server.CreateObject("ABCDB.DBCon")

    • ベストアンサー
    • HTML
  • メモリを解放しないとどうなる?

    趣味でプログラムの勉強をしています。 初歩的な質問になると思いますが、よろしくお願いします。 C言語やC++言語のように、動的に確保したメモリを使用後に意識して解放しないといけない言語で、解放の処理をしないままプログラム(アプリケーション)を終了した場合にはシステム(OS?)的にはどのような状態になるのでしょうか? 例: ・malloc して free しない ・new して delete しない 確保されたメモリ領域がそのまま残り、システムとして使用できるメモリ量が減る(解放にはPCの再起動が必要)のでしょうか? それともアプリケーションの終了時に自動的に解放されるのでしょうか? Windowsの場合を想定してご回答いただだけると嬉しいです。

  • ASP(VBScript)にてExcelアプリケーションが終了しない

    こんばんは VBScriptでExcelを読込みサーバのDBに内容を登録後に終了をしているのですがサーバにExcelアプリケーションが残ったままになっています。 strGetFileName = "C:\a.xls" 'Excelシート設定 Set xlsApp = Server.CreateObject("Excel.Application") xlsApp.Workbooks.Open strGetFileName Set xlsBook = xlsApp.Workbooks(1) Set xlsSheet = xlsBook.Worksheets(2) ← 二枚目のシート --中略-- xlsSheet.Application.Quit 'Excelアプリケーションのメモリ開放 Set xlsSheet = Nothing Set xlsBook = Nothing Set xlsApp = Nothing といったコーディングなのですが処理を重ねるたびにタスクマネージャに Excelアプリケーションが残り、重くなってしまいます。 終了の方法が悪いのではないかとは思いますが、実現方法がわかりません。 オブジェクトをオープンしているのでクローズ命令でも試してみましたがうまくいきませんでした。 どなたかご存知の方いらっしゃいましたら教えてください。 OS Win2000 ASP,BASP 言語 Html,VBScript,JavaScript

専門家に質問してみよう