VBで作成したプロジェクトを実行している最中に「メモリが不足しています」というメッセージが表示されてエラーになってしまいます。PCを変えても同じエラーが出てしまいます。
このエラーをなくしたいのですが、メモリ不足となる原因がわからず困っています。どなたか知恵を貸して頂けませんでしょうか。お願いします。

A 回答 (5件)

ラベルって、実際には実体をもたないんですよね。


ラベルがそんなにメモリを消費するとは考えずらいですね。
もし上限を超えたのであれば、メモリのメッセージではない通知をしてくるはずです。

DB系ならasiasiさんの言われた通り、開放を行うことが大事だと思います。
もしくはVariant型を多様してたり、異様な大きさの配列が存在していたりするのも、メモリ消費に大きく影響します。
DB操作の3点セット
(1)set Rs = オープン
(2)Rs.Close
(3)set Rs = Nothing

あとはSpreadにアイコンを大量に入れてた時に、ぼくも同じようなエラーを出した記憶があります。
データは出来るだけ開放。変数は必要のないものなら、共通変数にしない などなど
一概に言えることでは ありませんね。
    • good
    • 1

単にメモリ及びディスク領域の割り当てが不足しているだけでわ?



Win2000は普通に起動しても100M前後メモリを使いますし、
メモリが128MBだったりしますとBV立ち上げただけで何もできなくなってしまいます。多分ですが。。。

ちなみに自分はその様な経験はないので見当違いかもしれませんが。
    • good
    • 0

他の回答に加えて、


データのソースがACCESSを使用しているのなら、DBやテーブルの開放をしていない、閉じていないのではないでしょうか。また、テーブルを開きすぎているなど。
その他考えられるのはオブジェクトの開放を行っていないのではないでしょうか。そのあたりの詳細はインターネットでも調べて勉強してください。
    • good
    • 0

>確かに大量のラベル



一つのフォームに張りつけられたコントロール数の上限を超えているかもしれないですね。254個までだったと認識してます。

書いている内容には自信がありますが、あなたの疑問を解決しているかは不明なので、「自信なし」にしてます。
    • good
    • 0

あなたの作成しているプログラムが原因でしょう。



処理内容、開発環境、開発OSが分からないので想像でしか書けませんが、

・大容量のテキストファイルを開いている
・テキストボックスに必要以上のデータを入力させる
・はたまた別ocxの不具合?

などなどをしていれば、「メモリが足りない」なんて現象に陥ります。

ソースコードがあれば他の方も回答しやすいでしょう。

この回答への補足

確かに大量のラベルにデータを反映させています。
それが原因なのでしょうか。

環境を書くのを忘れていました。申し訳ございません。
OS WIN2000 
ツ-ル visualstudio6 sp5 です。

補足日時:2002/01/08 11:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qメモリに余裕があるのにヒープが確保できないです。

趣味のプログラムなので切実な問題ではないのですが、
1秒間隔に処理を行うプロセスを-Xmx64Mの指定で6つ起動しようとするのですが、
6つ目でヒープが確保できなくて処理が走りません。
スレッドは1プロセスあたり15くらいです。
OSはWindowsXPでCPUはPentium Dual-core E2140で
メモリは2GBつんでいるのですが、
タスクマネージャでみると1GB強しかつかってません。
できれば6つ同時に走らせたいのですが、方法はありますでしょうか?

Aベストアンサー

ヒープエリアはたしか全プロセスで共通に使われるはずです。
-Xmx64M を -Xmx128M 等に変更して動かしてみて下さい。

QVB:「実行時エラー53 実行ファイルが見つかりません」

お世話になっています。
VBよりOracle8.1.6に接続し、指定エクセルのデータを
OracleDBにアップロードするというアプリケーションを
社内で配布しています。

一部のPCから、
「実行時エラー53 実行ファイルが見つかりません」
エラーが発生するのです。私のPCからは正常に動作しますし
先週まで成功してたのに今週いきなりこのような現象がおこりまして
悩んでおります。

ちなみに同アプリケーションの別フォームは全PCで正常に
動いていまして、違いといえば、上記エラーが出る場面のみ唯一
Working.aviファイルを実行中呼び出してるところだと思うんですが。

あと先週まで動いてたのに今週から動かないのも気になります。
今週前半にOSのアップデートを行ったのですがそれが原因
だったりすることはあるでしょうか、、
よろしくおねがいします

Aベストアンサー

フルパスで指定しているWorking.aviが、そのパスに存在しなくなったことが原因であると考えられます。
例えば、OSのアップデートにより、ドライブの構成が変わったとか、ありませんか?
あるいは、Working.aviがネットワーク上に存在するとしたら、Working.aviが存在するファイルサーバーの権限等がリセットされ、Working.aviを開けなくなっているとかはありませんか?

エラーが発生しているPCで、エクスプローラー等で、そのファイル自体を探してみて下さい。
そうすることにより、原因が明らかになると思います。

QC/C++言語のメモリについて

C言語でメモリを2種類?に分けると、スタックとヒープがあります。
ヒープは mallocなどで確保し、freeで解放しますがスタックは解放する必要がありません。
そのスタックは通常、何バイトまで可能なのでしょうか?

あと関数外のファイルの先頭に int[1000000];とした場合、このメモリはmallocで確保していませんが、
どこに作られるのでしょうか?

私のパソコンはメモリが2GBでWindows2000ですが、CやC++で最大、何バイトまでメモリが使えますか?
また、一番多くメモリを確保できるなら、OSはなんでも構いません。

解釈等も間違っていたらご指摘していただきたいです。

Aベストアンサー

マイコン向けのプログラムを書いてます、Interestと申します。

> C言語でメモリを2種類?に分けると、スタックとヒープがあります。

間違いではありませんが、ちょっと足りません。プログラムで使用するメモリはもう少し細かく見ると、次のようになっています。

(P) 実行される命令(ProgramとかCodeと呼ばれます)
(C) 定数など変更されないデータ
(D) 初期化されるデータ
(B) 初期化されないデータ
(H) プログラムから動的に割り当てられるメモリプール(これがヒープです)
(S) ローカル変数、関数の引数、呼び出し元関数へのリンクに使用する比較的短命なものに使用するメモリプール(これがスタックです)

> そのスタックは通常、何バイトまで可能なのでしょうか?

開発環境によって初期値が決まっているようで、どれだけ割り当てるか変更できるようです。OSには依存しません。Visual C++ 6.0の場合、スタックサイズの初期値は1MBだそうです。
参考 http://okwave.jp/qa2645032.html

> あと関数外のファイルの先頭に int[1000000];とした場合、
> このメモリはmallocで確保していませんが、どこに作られる
> のでしょうか?

最初に説明した内容に照らすと、一般に外部変数は0で初期化されますから、(D) 初期化されるデータ の領域に確保されることがわかります。

> 私のパソコンはメモリが2GBでWindows2000ですが

WindowsなどのOSは物理メモリが足りなければハードディスク上の仮想メモリも使用しますので、単純に何バイトまで使えます、とはお答えできません。

> 一番多くメモリを確保できるなら、OSはなんでも構いません。

どのようなプログラムを組もうとしているのですか?

マイコン向けのプログラムを書いてます、Interestと申します。

> C言語でメモリを2種類?に分けると、スタックとヒープがあります。

間違いではありませんが、ちょっと足りません。プログラムで使用するメモリはもう少し細かく見ると、次のようになっています。

(P) 実行される命令(ProgramとかCodeと呼ばれます)
(C) 定数など変更されないデータ
(D) 初期化されるデータ
(B) 初期化されないデータ
(H) プログラムから動的に割り当てられるメモリプール(これがヒープです)
(S) ローカル変数、関...続きを読む

Q既にVBアプリが入っているPCでの自作VBアプリの実行でエラー

お世話になります。
なんとかVBでEXEまで作成しました。
自分のPCでは実行できたのですが、
他のPCではエラーになります。
MSFLXGRD.OCXがない・・・みたいなエラーです。
エラーになったPCには既にVBのアプリケーションが
インストールされていて、必要なランタイムは
多分そろっていると思います。
検索したらMSFLXGRD.OCXは見つかりました。
これってバージョンの問題ですか??

フリーで色々あるランタイムパッケージなどを
ダウンロードした方がいいですか?
既存のAPが動かなくなると困るので、
あんまりしたくないんですが。

VB6.0でOSはどれも2000です。
よろしくお願いいたします。

Aベストアンサー

#2です。

MSFLXGRD.OCXだけを選択して、最低限のsetup.exeをセットアップウィザードで作ればいいんです。

しかし、
セットアップウィザード時に、インストーラに組み込むモジュールの一覧
もしくは、
インストーラ内の情報ファイル(拡張子忘れました)記述されているファイル一覧
と、
インストールしようとする端末の各ファイルを比較して、バージョン違いが無ければそのままsetup.exeでインストールしても、問題ありません。

#OSが同じで、インストールしているソフトも同じで、SPも同じであれば、何も問題ありませんが。

Qヒープ領域の限界値設定

大量にメモリを消費するアプリケーションを下記環境で動作させようとしています。
WindowsXP SP2, 1GB RAM
タスクマネージャの物理メモリの利用可能 674,500K位
この状態でヒープ領域をレジストリで変更しようと思っているのですが
限界値が不明です。
徐々に3071⇒4096⇒8192と上げていっているのですが、限界値を超してしまうとOS自体が起動できなくなる恐れがあるので怖いです。
アドバイスください。

Aベストアンサー

回答No.1に挙げた「デスクトップ ヒープ」で用いている「ヒープ」という用語は、グラフィックサブシステムで使用するためにWindowsのグラフィックサブシステムがあらかじめ確保して自分自身のために使用するメモリ領域のことを指しています。

また「mallocが使用するヒープ領域」という場合の「ヒープ」という用語は、ライブラリ関数mallocがWindows APIを使用して確保するメモリ領域のことを指しています。

ですので、「デスクトップ ヒープ」と「mallocが使用するヒープ領域」は違うものです。


「mallocが使用するヒープ領域」がどこから来るのかは、コンパイルに使用した言語環境のライブラリ関数mallocの動作内容に依存します。

仮にMicrosoft Visual C++(VC++ Version 6.0以降)を使用してコンパイルし、ライブラリ関数は標準添付のものを使用したとすると、mallocはWindows APIのHeapAllocで取得したメモリ領域をライブラリ内で細分(サブアロケート)して返します。またこの場合、HeapAllocで取得できるメモリ領域の量に固定の上限はなく、PCのメモリ実装量、Windowsのスワップ領域の大きさ、それとアプリケーションプロセスのメモリマップが許す限り、いくらでもHeapAllocはメモリを割り当てて返すことができます。

ですので上記の場合、mallocも同様に「PCのメモリ実装量、Windowsのスワップ領域の大きさ、それとアプリケーションプロセスのメモリマップが許す限りいくらでも」メモリを割り当てて返すことができます。

なお、上記動作はライブラリのソースコードを見て確認したものですので、使用しているコンパイラがVC++ではない、あるいはVC++でもVersion 6.0より古い場合、mallocが「いくらでもメモリを割り当てて返すことができる」かどうかは分かりません。(しかし、返すメモリ領域が「デスクトップ ヒープ」と違うものであることだけは変わりません。)

回答No.1に挙げた「デスクトップ ヒープ」で用いている「ヒープ」という用語は、グラフィックサブシステムで使用するためにWindowsのグラフィックサブシステムがあらかじめ確保して自分自身のために使用するメモリ領域のことを指しています。

また「mallocが使用するヒープ領域」という場合の「ヒープ」という用語は、ライブラリ関数mallocがWindows APIを使用して確保するメモリ領域のことを指しています。

ですので、「デスクトップ ヒープ」と「mallocが使用するヒープ領域」は違うものです。


「mal...続きを読む

QVB6.0 プロジェクトオープン時のエラーについて

色々と調べてみたのですが、私の実力では原因も解決策もわからなかったので質問させていただきます。

やりたいこと
WindowsNTにて開発していたVB6(SPなし?もしくはSP4くらい。)アプリケーションを、WindowsXPのVB6(SP5)のマシンで開きたい。

現象
WindowsXPで開こうとすると、エラーが表示され、プロジェクトのあるフォルダに以下のログが出力される。

行 195: クラス ○○○○.ExploreBar(コントロール exbWs) はロードされていません。
行 212: クラス ○○○○.FlatButton(コントロール btnClose) はロードされていません。
行 202: プロパティ名 _ExtentX(exbWs) が不正です。
行 203: プロパティ名 _ExtentY(exbWs) が不正です。
行 218: プロパティ名 _ExtentX(btnClose) が不正です。
行 219: プロパティ名 _ExtentY(btnClose) が不正です。

ためしに、Windows2000のVB6(SP5)で開くと、何もエラーが出ることなく、正常に開くことが出来ました。
もう何がなにやら・・・。

調べてみたところ、コントロールの参照が巧くいってないみたいです。
(エラーを出しているfrmファイルを開いて確認しようとすると、エラーになっている箇所がピクチャーボックスになっていた。)
そこで、参照設定やコンポーネントの設定を確認してみたのですが、どうもNTとXPでは一致しているみたいです。(同じ場所にチェックが入っている。)

もしかして調べる観点からしてズレているのでしょうか。

原因と解決方法をどうか教えていただきたく・・・。
お力添えのほど、よろしくお願いします。<(_ _*)>

色々と調べてみたのですが、私の実力では原因も解決策もわからなかったので質問させていただきます。

やりたいこと
WindowsNTにて開発していたVB6(SPなし?もしくはSP4くらい。)アプリケーションを、WindowsXPのVB6(SP5)のマシンで開きたい。

現象
WindowsXPで開こうとすると、エラーが表示され、プロジェクトのあるフォルダに以下のログが出力される。

行 195: クラス ○○○○.ExploreBar(コントロール exbWs) はロードされていません。
行 212: クラス ○○○○.FlatButton(コントロール btnClose) はロードされてい...続きを読む

Aベストアンサー

正常に開くパソコンでエラーになっているプロパティを一度削除してから
エラーの起きたパソコンで開き直し、もう一度プロパティを設定してはどうでしょう?

私もVB6で同じような経験がありますが、この手順が一番手っ取り早いと思います。

Qメモリをたくさん使うテストプログラム

Linuxで、メモリをたくさん使うようなテストプログラムを作りたいのです。
メモリといっても、プログラムコードの入っているテキスト領域、データの入っているデータ領域、ヒープ領域などがあると思いますが、
これらのいずれかのみをたくさん使うようなプログラムを作りたいのです。
例えば、サイズの大きなプログラムであれば、テキスト領域が大きくなったり、
大容量の文字列を扱ったりすると、データ領域が大きくなったりするんでしょうか?
関数とメモリ使用量の関係があまり分かっていません。
どうか教えてください。

Aベストアンサー

#1です。
>テキスト領域を大量に確保するには、無駄に長いプログラムを書けばいいのでしょうか?
はい、その通りです。
>mallocした領域にデータを書き込むと、今度はデータ領域がたくさん使われるのでしょうか?
いいえ、mallocした領域は、ヒープ領域であり、ヒープ領域にデータを書き込んだからといって、データ領域が増える訳ではありません。

コーディングでは、以下のようになります。
-----------------
#include ....ヘッダファイル
char data1[256];  ・・・・データ領域
main()
{
data data2[256];  ・・・・スタック領域
if (・・・){    ・・・・テキスト領域
・・・
}
malloc(3000)    ・・・ヒープ領域へ確保
}

main等の関数の外側で確保した領域は、データ領域に取られます。
main等の関数の内側で確保した領域は、スタック領域に取られます。(static指定を除く)
実際に命令(if文など)は、テキスト領域にとられます。
mallocで確保したメモリはヒープ領域に取られます。
(但し、テキスト領域の言葉は正しいかどうか不明です。参考URLを参照下さい)
ところで、どうして、メモリをたくさん使うようなテストプログラムを作りたいのですか、よかったら教えて下さい。そのほうに興味があります。

参考URL:http://www1.cts.ne.jp/~clab/hsample/Point/Point19.html

#1です。
>テキスト領域を大量に確保するには、無駄に長いプログラムを書けばいいのでしょうか?
はい、その通りです。
>mallocした領域にデータを書き込むと、今度はデータ領域がたくさん使われるのでしょうか?
いいえ、mallocした領域は、ヒープ領域であり、ヒープ領域にデータを書き込んだからといって、データ領域が増える訳ではありません。

コーディングでは、以下のようになります。
-----------------
#include ....ヘッダファイル
char data1[256];  ・・・・データ領域
main()
{
data...続きを読む

QVB5.0 で実行時エラーがでる

VB5.0でDBGRIDを呼び出し、戻ってきてからメッセージボックスを表示しようとすると、「実行時エラー5 プロシージャの呼び出し、または引数が不正です」が出ます。それもEXEから実行する時だけです。
OSはXPです。
以下のプログラムで、メッセージボックスを表示しなかったら実行時エラーはでません。

F_SelKokyak.Show vbModal
If Wk_Modoru = 0 Then
  Set RecUri = MAINdb.OpenRecordset("Select * " & _
" From FT_Uriage " & _
" Where Uri_MiseCode = " & Wk_MiseCode & _
" And Uri_KaisKbn = " & 1 & _
" And Uri_KyakCode = " & Sel_KyakCode & _
" And Uri_UriSbt = " & 0 & _
" And Uri_UriKakKin <> 0" & _
" Order By Uri_UriNo; ")

If RecUri.RecordCount = 0 Then
RecUri.Close
Set RecUri = Nothing
If Wk_KaisKbn = 2 Then
MsgBox "売掛金はありません。", vbCritical, "入力エラー"
F_EigMainInp!txtKyakName2.SetFocus
Exit Sub
End If
End If

VB5.0でDBGRIDを呼び出し、戻ってきてからメッセージボックスを表示しようとすると、「実行時エラー5 プロシージャの呼び出し、または引数が不正です」が出ます。それもEXEから実行する時だけです。
OSはXPです。
以下のプログラムで、メッセージボックスを表示しなかったら実行時エラーはでません。

F_SelKokyak.Show vbModal
If Wk_Modoru = 0 Then
  Set RecUri = MAINdb.OpenRecordset("Select * " & _
" From FT_Uriage " & _
" Where Uri_MiseCode = " & Wk_Mis...続きを読む

Aベストアンサー

> 元の現象
> は発生します。
> On Errorを最初の行に入れましたが、同じ現象です。

そうですか・・・と言うことは、
「システムのエラー処理自体がおかしくなっている」か、
「(何故か)全然関係ない箇所でエラーが発生している」か、
どちらかでしょうね。

前者なら、私にはお手上げ(「MsgBoxを使うのをあきらめる?」ぐらいしか提案できません)、
後者なら・・・「全コード(全プロシージャ)に、同様に「On Error」と「行ラベル」を入れてみて、実際のエラー発生箇所を探す」ぐらいしか無いと思います。

Qjava string 配列の使用メモリ

String[][][] arg = = new String[x][x][x];
でxが638の時にjava.lang.OutOfMemoryErrorになってしまいます。
VM起動時のヒープ最大値は1GBまで試しましたがダメでした。

このときargオブジェクトはどれだけのメモリを必要とするのでしょうか?

Aベストアンサー

このnewで作られるオブジェクトは、配列オブジェクトだけです。Stringオブジェクト自体は作られません。
なので、オブジェクトのサイズとしては、配列オブジェクトのサイズだけを考えればよいことになります。
(ちなみに、メソッド本体はクラスに1つあるだけで、作成したオブジェクトの数だけできるわけではないですから、オブジェクトを作ると、新たにメソッドの分のメモリが必要になるわけではありません)

さて、argオブジェクトのサイズですが、1つのオブジェクトへの参照を保持するのにまず何バイトが必要か考える必要があります。
32bitのJavaだったら、たぶん32bit=4バイトでしょう。
この配列の要素数はx^3個ですので、1つあたりが4バイトとなると、x^3 * 4 バイトのメモリが最低限必要ということになります。
もちろん、他にも多少メモリが必要でしょうが、xが大きいときのことを考えるわけですし、無視しても問題ないでしょう。

x=638の場合を計算してみると、638^3 * 4 = 1038776288 となります。
これは約990MB で、だいたい1GBです。
ヒープの最大値を1GBで試したということですので、計算と合っているのではないでしょうか。

このnewで作られるオブジェクトは、配列オブジェクトだけです。Stringオブジェクト自体は作られません。
なので、オブジェクトのサイズとしては、配列オブジェクトのサイズだけを考えればよいことになります。
(ちなみに、メソッド本体はクラスに1つあるだけで、作成したオブジェクトの数だけできるわけではないですから、オブジェクトを作ると、新たにメソッドの分のメモリが必要になるわけではありません)

さて、argオブジェクトのサイズですが、1つのオブジェクトへの参照を保持するのにまず何バイト...続きを読む

QVB6 実行時エラー -2(fffffffe)

VB6で作成したAPでエラーで出て困っております。
調べても解決策が見つからず、皆様のお力をお借りしたいと思います。

【環境】
Windows XP SP3
microsoft visual studio 6.0 sp6

【現象】
webbrowserコントロールを利用し、GIFファイルの表示を行う処理で以下のエラーが発生。

実行時エラー '-2(fffffffe)':
オートメーション エラーです

【ソース】

Private GifLoad As Boolean

--------------------------------------------------------------------------------
Private Sub GifFileLoad()
  Dim Hstyl As HTMLStyle
  Dim GifName As String

  GifName = Gifファイルのフルパス

  WebBrowser.Navigate GifName
  GifLoad = False

  '表示を読み込むまで待機
  Do
     DoEvents←ここでエラーが発生
  Loop Until GifLoad

  Set Hstyl = WebBrowser.Document.Body.Style

  With Hstyl
     .OverFlow = "hidden"
      .MarginLeft = "0px"
     .MarginTop = "0px"
  End With

  Set Hstyl = Nothing
End Sub

--------------------------------------------------------------------------------
Private Sub WebBrowser_DocumentComplet(ByVal pDisp As Object,URL As Variant)
  GifLoad = True
End Sub

--------------------------------------------------------------------------------


エラー発生後、メッセージのデバッグボタンでデバッグモードに移行すると、問題なくDoEventsを通り抜けます。単純にResume Naxtを追記したらいいだけのような気もするのですが、エラーの内容、原因が特定できず悩んでいます。

この事象に対して情報をお持ちの方がおられましたら、ご教授お願いいたします。

VB6で作成したAPでエラーで出て困っております。
調べても解決策が見つからず、皆様のお力をお借りしたいと思います。

【環境】
Windows XP SP3
microsoft visual studio 6.0 sp6

【現象】
webbrowserコントロールを利用し、GIFファイルの表示を行う処理で以下のエラーが発生。

実行時エラー '-2(fffffffe)':
オートメーション エラーです

【ソース】

Private GifLoad As Boolean

--------------------------------------------------------------------------------
Private Sub GifFileLoad()
  Dim Hst...続きを読む

Aベストアンサー

自信はありませんが、なんとなく、DoEvents が多重呼び出しされて、おかしくなっているのかな、という気がします。
試しに、次の Sleep 関数を宣言しておいて、
Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

Do
  DoEvents
  Sleep 100
Loop Until GifLoad

のようにしてみるとどうなるでしょうか?


それと、

Set Hstyl = WebBrowser.Document.Body.Style
With Hstyl
  .OverFlow = "hidden"
  .MarginLeft = "0px"
  .MarginTop = "0px"
End With

の部分を

Private Sub WebBrowser_DocumentComplet(ByVal pDisp As Object,URL As Variant)

の中に入れてやれば、Do ~ Loop を使わなくて済むと思うのですが、そうしない理由がなにかあるのでしょうか?

自信はありませんが、なんとなく、DoEvents が多重呼び出しされて、おかしくなっているのかな、という気がします。
試しに、次の Sleep 関数を宣言しておいて、
Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

Do
  DoEvents
  Sleep 100
Loop Until GifLoad

のようにしてみるとどうなるでしょうか?


それと、

Set Hstyl = WebBrowser.Document.Body.Style
With Hstyl
  .OverFlow = "hidden"
  .MarginLeft = "0px"
  .MarginTop = "0px"
End With

の...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報