• 締切済み

メモリ解放について

<VC++で作成したDLLをVBで呼ぶ処理> DLL側でメモリ割り当てを行ったあと、VB側でメモリ解放を したいのですが、方法がわかりません。 教えてください。

みんなの回答

  • itohh
  • ベストアンサー率45% (210/459)
回答No.3

こんにちは。itohhといいます。 mallocで確保されたエリアは開放できないと思います。 なぜなら、VBからでは、Free関数が直接呼べないからです。 もし、どうしてもVBで解放したいのであれば、malloc関数の代わりに GlobalAlloc関数を使用してください。 そのときのハンドルを返すようにすることによってGlobalFree関数(解放する関数) を使用することが出来るようになります。 関数の対応は、 malloc関数 -> GlobalAlloc関数(およびGlobalLock関数) Free関数  -> GlobalFree関数(およびGlobalUnlock関数) です。

  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 DLL側で動的にメモリを割り当てた場合は、解放しなければいけません。 (メモリリークしてそのうち再起動しなければいけなくなります。) ご自分でDLLを作成しているのでしょうか? それならば、DLLで解放する関数を作成しては如何ですか?

gaburi
質問者

補足

DLL側でmallocなどでメモリ割り当てをした場合、 VB側ではメモリ解放はできないという事でよろしいのでしょうか?

  • nakashi
  • ベストアンサー率51% (21/41)
回答No.1

VBの変数スコープの範囲で動的に廃棄しますので なにもしなくてよい 下記ATLの場合 sub vfHoge  dim sFunctonName as string  sFunctionName = oHoge.FunctionName endsub 'ここでsFunctonNameの領域開放 STDMETHODIMP CBSFDevKit::get_FunctionName(BSTR *pVal) {  *pVal = ::SysAllocString(m_sFunctionName);  return S_OK; }

gaburi
質問者

補足

VBもVC++も初心者なので見当違いだったらすみません。 VC++のDLL側で割り当てたメモリもVB側から参照しただけで 解放されるのでしょうか? VC++でいうfreeのような事はしなくていいのでしょうか? 確認のためお願いします。

関連するQ&A

  • メモリの解放

    以前にも質問があったみたいですが、 結論が載ってなかったので、質問します。 VC++で作成したDLLをVBで呼び出した場合に、 例外エラーになってしまいます。 たぶん、DLL側で確保したメモリを解放していないからだと思うんですが…。 で、解放の仕方がわかりません。 どちら側でどうやればいいのでしょうか? VC++初心者です。 お願いします。

  • メモリの解放について

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

  • メモリの解放の仕方

    恐れ入ります。 メモリを解放するとはどういうことなんでしょうか? for loopをくりかえしてるうちにどんどんどんどんメモリの使用率があがっちゃって。おそらくメモリを解放すればあがらなくなるとおもうのですがその解放の仕方がよくわかりません。そもそもメモリとvbの関係ってどういう関係なんですか?おしえてください。お願いします。

  • VisualStudio2010 DLL作成方法

    VisualStudio2010を使っています(初心者)。 VBで作成していたのですが、一部VC++を使わなければいけなくなりました。VC++はDLLで作成して、VBの方でDLLを参照して処理を行いたいと考えています。 そこで試しに作成したVC++で作成したDLLをVBで参照しようとしたらERRORになってしまい上手にできませんでした。※ERRORの内容までは詳しく覚えてません。VC++のDLLを作成~VBのDLLの参照までを説明しているサイトなどありましたら教えて下さい。 よろしくお願いします。

  • メモリを解放しないとどうなる?

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

  • メモリの解放について 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ではメモリ解放はどうなっているのでしょうか? まだ使いませんが、頭の片隅に入れておきたいです。

  • VC++6.0からVBで作成したActiveX.DLL内の関数が呼出しできない

    VB6.0で作成したActiveX.DLLをVC++6.0(Win32SDK)側で 呼び出すプログラムを作成中です。 VB側(DLL)では問題なく作成できています。 Classに1つPublic関数を作成しただけです。 (Instancingは5MultiUseにしてあります) しかし、VC++側の呼出しでDLL内の関数が 呼び出せないのです。 LoadLibraryExでDLL自体のハンドルは取得できるのですが GetProcAddressで関数の取得時にNULLが返ってきてしまいます。 今まで試したことは ・VBからの呼出しはOK ・MFCだとOK ・SDKでもuser32.dll呼出しのサンプルは関数も実行できる です。 今からMFCへ以降するのは厳しいのでSDkでの方法を 知りたいです。 VB側が悪いのかもしれませんが、関数1つですし、 いじるところもほとんどないので多分VC++側だと 思っています。 なにか注意点とか確認するところをおしえていただければ 幸いです。 環境 Windows2000 SP3 VB6.0 SP5 VC++6.0 SP5 Win32SDK

  • Linuxのメモリ解放処理

    質問内容を下記にまとめてみました。 どなたかお詳しい方、ご回答下さいませんでしょうか。 情報ソースへのリンクでも構いません。よろしく お願いします。 【環境】 PCサーバ;PentiumIII 1GHz*2、2GB SDRAM、60GB*3 HDD(RAID5;記憶領域約120GB) Redhat Linux7.1J Oracle 8i for Linux(8.1.7) 【現象】 OS起動時からRAMをほとんど開放せず、処理の度にHDDから読み込んだデータをRAM上に展開し続けている。 残りの空きメモリが4MBを割り込んだ辺りから空きメモリの減少が止まる。問題なく処理は続行されている。 この間、約2GB確保されたスワップ領域は全く使用されていない。 以上は、Oracle上でPL/SQL及びCのプログラムを実行している際に確認された。 【仮説】 ・Linuxは可能な限りメモリ上にキャッシュを残す仕様となっていて、残り空きメモリが一定の水準以下になるタイミングになって初めて割当済みメモリを解放しているのではないか。 【疑問】 1.割当済みメモリ解放の閾値の設定はどこで行っているのか 2.スワップ領域が使用されていないのはなぜか

  • DLLをメモリに常駐する設定とした場合、DLLのメモリからの解放はどれくらいの期間で実現されるか

    Windows XP 高速化について。DLLをメモリに常駐する設定とした場合(Windows XPのレジストリ設定)、DLLの再利用がどれくらいの期間なかった場合、メモリから解放されるのでしょうか? 十分メモリがある場合は、どこまでも解放されず、DLLはメモリに常駐されっぱなしになるのでしょうか?それとも一定時間再利用がなければ解放になるのでしょうか?

  • VB.netの配列とVB6の配列の違い

    VB6で画面を作成し、演算処理を行うDLLをVC6で作成しています。 下記のコードでVB6でSingle型の2次元配列を宣言しま、VCのDLLでエクスポートしている関数に渡 します。 VC6DLL側のコード---------- EXPORT void __stdcall TESTFUNC (float *pfData,long nSize{ } VB側のコード---------- 宣言 Declare Function TESTFUNC Lib "TEST.dll" (ByRef pfData As Single, ByVal nSize As Long) As Long 配列宣言 Public sngDat(999,1) as single 呼び出し TESTFUNC sngDat(0,0),1000 このように呼び出した場合、VC6のTESTFUNC にブレークポイントを設定し、停止するとpfDataの ポインタをインクリメントした場合、sngDat(0,0),sngDat(1,0),sngDat(2,0)と、1次元目の添え字を インクリメントした状態になるように、メモリに格納されています。 この動作を前提として、VB.net側でも同じように呼び出してみました。 VB.net側のコード---------- 宣言 Declare Function TESTFUNC Lib "TEST.dll" (ByRef pfData As Single, ByVal nSize As Integer) As Integer 配列宣言 Public sngDat(999,1) as single 呼び出し TESTFUNC(sngDat(0,0),1000) VC側は全く同じコードを利用するとします。 同じように、VC6のTESTFUNC にブレークポイントを設定し、停止するとpfDataの ポインタをインクリメントした場合、sngDat(0,0),sngDat(0,1),sngDat(1,0)と,sngDat(1,1)、と1次元目の添え字を インクリメントせず、2次元目の添え字をインクリメントした状態になるように、メモリに格納されています。 VB6→VC6のDLLの場合の配列渡しと、VB.net→VC6のDLLの場合の配列渡しで違いがあるのは 何故でしょうか?また、VB.net側の配列渡しの仕様を、VB6側の仕様に合わせる方法は無いのでしょうか? よろしくお願いいたします。