現在VC++6.0を使用して数値解析を行っているのですが、ワークステーションでメモリを1256MBに増設して、500MBくらいのメモリを使用する解析を行ったところ、「トータルイメージサイズが最大値(268435456)を越えています; イメージは動作しない可能性があります」という警告が出ました。しかし実行してみると正常に動作します。

なぜそんな警告がでるのでしょうか?どなたか教えてください、お願いします。
※OSはWINDOWS2000を使用しています。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

補足読みました。



よく見たら、268,435,456バイトって256MBですね。
で、MSDNを調べてみたところ、単純にリンカの出力する
警告のようですね。
#LNK4013、LNK4084にあります。

これによると、/BASEオプションで設定されている、
もしくはディフォルト値を越えているために、リンク時に
警告をはき出すようです。どうやらこれらを見てみると、
アプリケーションの最大サイズは256MBとされている
ようです。

DLLやOCXなどにしてここのアプリケーションサイズを
小さくするか、メモリを動的に取得するようにして、
サイズを減らさないと、その警告は消えないと思います。
#ちなみに実行結果が正常なのも保証はされないと
#思いますよ。

って、toysmith様も同じことを書かれていますね。
ではでは☆
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
メモリを動的に取得できるようにしてみたいと思います。

大変参考になりました。ありがとうございます。

お礼日時:2001/05/19 21:47

Windowsシステムではアプリケーションサイズ(CODE+DATA)が2^28バイトを超えるとこの警告を出すようです。


多分、グローバルで大きな配列を確保しているのでしょう。

数値解析だと大きな配列は必須ですから他の方法を考える必要があるでしょう。
(アルゴリズムを見直せば何分の1かになるかもしれませんが)

VirtualAllocを使えば4GBまでの領域を確保可能です。
ただし、仮想空間で確保する為ディスク開き容量、スワップ頻度などを考慮しなければなりません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変参考になりました。

お礼日時:2001/05/19 21:44

単純に、.objファイルが大きすぎるのではない


でしょうか?

それにしても数値解析だけで500MBというのは
すごいですね・・・
#もう少しメモリの使い方を考慮した方が計算が
#早くなるのではないでしょうか?
#OSのスワップも入るだろうし・・・

ではでは☆

この回答への補足

ご回答ありがとうございます。

早速調べてみたところ、.objファイルはどれも数KB程度で小さいです。
私の扱っている解析手法はもともとスーパーコンピューターで行われていた手法で、超並列化は行えてもメモリを削減することは解析手法の性質上不可能です。
500MBというのもWSの性能を見るために行ったテストで、実際は現在の1.2GBでも全然足りないというのが現状で、まだまだメモリを増設する必要があります。

ところで、このWSは最初、メモリが256MBでメモリを増設する前にVC++をインストールしました。そのためVC++が、メモリが増設されたのを認識していないということはあるのでしょうか?

補足日時:2001/05/18 21:40
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

Qプロセスのメモリ使用量の確認方法

プロセスのメモリ使用量の確認方法についての質問です。
#実際にプログラミングされている人の方が詳しいかと思い、こちらのカテゴリに
#質問させて頂きます。

プロセスのメモリ使用量を確認するために、パフォーマンスモニタを使おうと
考えています。
「オブジェクト」に「Process」を指定したときの、「カウンタ」では
何を選択すれば確認できるでしょうか。
カウンタごとの説明は読んだのですが、明確に理解することができませんでした。
識者の方、ご教授願います。
また、その他のツールを使った方法があれば教えてください。

Aベストアンサー

私は以下の方法を使用しています。

WindowsNT系でしたら、タスクマネージャーでプロセス一覧&メモリ使用量が分かります。

95(95~Me)系の場合は、物理メモリに余裕をもたせた状態でシステムモニタを監視しつつプロセスを起動します。(減った分がプロセスの大体のメモリ使用量)

UNIX系だったらコマンド一発レベルで分かるんですけどね~。

QC++のnewで確保したメモリーの解放の確認方法

C++で作成中のプログラムの一部で、長い文章も処理できるように、構造体とメモリーの動的確保を使用しています。
ただ、動的に確保したメモリーは自分で解放しなくてはならないのですが、プログラムが単純なうちは開放のミスを発見できますが、長くなるとバグで一部開放されない可能性も捨てきれません。

そのようなときに全て開放できたか確認する方法は無いのでしょうか?

開発環境につきましては、
OS WindowsXP HomeEdition
コンパイラ BCC
言語 C++ コンソールアプリケーション

struct string {
char str[512];
struct string* nextstr;};
簡単には、このような構造体を new で確保し、開放は、先頭から delete してますが、
構造体がこれより結構複雑なため、処理部が長くきちんと開放できているか自信が有りません。

Aベストアンサー

newやdeleteをdefineで括ってまとめて監視してはどうですか?

extern int g_count;
#define NEWOBJECT(T) new (T); g_count++
#define DELETEOBJECT(ptr) delete (ptr) ; g_count--
int g_count;
//ここのstringは自分で定義した構造体
string *p = NEWOBJECT(string);
DELETEOBJECT(p);
printf("メモリ確保数=%d",g_count);

のようにするとか、
リリース版の時は
#define NEWOBJECT(T) new (T)
#define DELETEOBJECT(ptr) delete (ptr)
とすれば余計の処理も消えますし。

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...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Q読み込み中にアクセス違反が発生しました、と出ます。これを回避することは

読み込み中にアクセス違反が発生しました、と出ます。これを回避することはできますか?

C++でプログラミングをしています。
現在、ポインタ(p)に入れたアドレスをずらしていって、メモリの任意の位置の値を表示する、というプログラムを制作しています。

具体的に言うと、上記のプログラムではない別のプログラムを実行し、そのプログラムで宣言した変数のアドレスを表示させます。そしてそのプログラムが動いている最中に、上記のプログラムを起動させ、ポインタpにその変数のアドレスを代入して、表示させようとしました。

しかし、止まってしまいます。デバッグしてみると、「test.exe の 0x00024ad5 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x0014fde8 を読み込み中にアクセス違反が発生しました」と出ます。

なんとかこれを回避して、ポインタに代入したアドレスを表示さすことはできませんか?
宜しくお願いします。

ちなみに、自分がかなり妙なことをしているのは自覚しているつもりです。

Aベストアンサー

#2です。
もう少し突っ込んで話をすると、今のOSはたいてい仮想アドレス方式で各プロセスのアドレス空間はそのプロセス内でのみ有効なものです。
つまり、プロセスAの0番地とプロセスBの0番地は値は同じでも全く別の箇所を指しているということです。

ですが、プログラムの中には複数プロセスで協調動作させる等の理由により質問のような他プロセスが扱うメモリの中身を参照・変更したい場合があります。
それを実現するのが共有メモリ等の機構である訳です。

Qプログラムの最大メモリ消費量の計測について

C言語あるいはC++でプログラムの最大メモリ消費量を測定するには
どうしたらよいのでしょうか。

計算機実験で測定が必要なのですが、なかなか情報がなくて困っています。

OSはWindows7でVC++で開発しています。

ご回答よろしくお願いします。

Aベストアンサー

バッチだと

@echo off
:LOOP
tasklist /fi "imagename eq explorer.exe" >> log.txt
sleep 1
cls
goto :LOOP

こんな風にしてメモリ使用量を取得できることから、
tasklistコマンドを叩いて、結果を解析するというような
プログラムを組めばよいのでは。

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);

Q【VC++6.0(MFC)】メモリの静的、動的割り当ての意味

いつも大変お世話になっています。
VC++初心者です。

大変初歩的な事なのですが、
理解できていないので質問をさせて頂きたいと思います。

new、deleteはメモリを動的に割り当て、開放しるようですが、
この動的とはどういう意味なのでしょうか。
動的があるのなら、静的にメモリ割り当てというものも
あるのでしょうか。
(静的、動的を区別することによって得られる
恩恵とは何なのでしょうか。)
具体的に例を挙げていただけると幸いです。

Aベストアンサー

>> 「確保される場所が違う」、これをもう少し厳密に言うと
>> 「確保されるメモリの場所が違う」という事でしょうか。
>> (例えば、
>> int i;みたいな変数は、Aという範囲のメモリを使いなさい、
>> new を使った変数は、Bという範囲のメモリを使いなさい、
>> というイメージでしょうか。
>> 稚拙な表現ですみません。)

参照URLにも記載されていますが、【int a】で確保した場合、
関数内のauto変数ならスタック領域、static変数やグローバル変数ならば
静的領域に確保されます。

【new】や【malloc】などで確保した場合はヒープ領域に確保されます。


>> >(可変長のCSVファイルを読み込みや、双方向リストなどのデータ構造を作成したい場合)
>> >いきなりデカイローカル変数等などを用意して使いまわしても良いと思いますが、実用的ではありません。
>> この内容を拝見して「何故、実用的でないのか」と疑問に思いました。
>> (確かに、あまり良くないな、感覚的には思うのですが、
>>  論理的には説明できないのです。)
>> つまり、私の挙げた例を使うと、メモリ範囲Bがあるのに、
>> メモリ範囲Aの部分を大量に消費してしまうから、
>> 実用的でないということでしょうか。

まず、関数内で宣言されるauto変数は、大概の処理系ではスタック領域に確保されるため、
コンパイルオプション等にもよりますが、それほど大きな領域を確保できませんし、
大きな領域を確保出来る環境を前提に作ってしまうと、移植性に乏しくなってしまいます。

newやmallocでメモリを動的に確保出来る利点は以下の通りと私個人では判断しております。

(1)配列では面倒なデータの削除や追加が可能なデータ構造を実現できる。
 通常の配列では、途中のデータを追加・削除しようとすると、データのコピー等が発生するなど
 処理が重たくなってしまいます。
 そこで、リスト構造などデータの追加・削除が容易な仕組みを実現することが必要となり、
 自己参照構造体やメモリの動的確保で実現を行います。

(2)例えば、メモリ領域が最大100M確保可能な環境があるとします。
 データaとデータbがあり、それぞれ可変長(0~100M)だが、
 データaとデータbは足して100Mを超えることは無いものとします。
 上記の場合、データa・データbのそれぞれの最大メモリ使用量は100Mのため
 足して200Mの領域を最初に確保したいと思いますが、環境が最大100Mまでしか
 確保できないため、出来ません。
 そこで動的メモリ確保となってくる訳です。


特にオブジェクト指向でプログラムを組むとなると、各タイミングで各種オブジェクトの
生成・消滅が発生します。
それを前提にある程度のオブジェクト数を最初に用意しておく事も可能ですが、コンストラクタや
デストラクタを活かすコードを書こうとした場合、new・delete演算子で生成・消滅させた
方が良いと思います。

私はwindows畑ではありませんが、microsoftのMFCなどもウィンドウやボタンを生成する毎に
それに対応するCButtonクラス等を継承したクラスを生成していたはずです。

以上

>> 「確保される場所が違う」、これをもう少し厳密に言うと
>> 「確保されるメモリの場所が違う」という事でしょうか。
>> (例えば、
>> int i;みたいな変数は、Aという範囲のメモリを使いなさい、
>> new を使った変数は、Bという範囲のメモリを使いなさい、
>> というイメージでしょうか。
>> 稚拙な表現ですみません。)

参照URLにも記載されていますが、【int a】で確保した場合、
関数内のauto変数ならスタック領域、static変数やグローバル変数ならば
静的領域に確保されます。

【new】や【mal...続きを読む


人気Q&Aランキング