• ベストアンサー

VC++の/Zm オプションについて

仕事でVC++で開発されたソフトに機能追加をしています。 環境はVisualC++6.0(SP3)&Win2Kです。 何年か前に開発されて他の人がやってたものを今回引き継ぎました。 SDKで開発しているソフトなのですが、グローバル変数が かなり多いです。おそらくそれが原因と思われますが、 今回の機能追加の途中でビルド時にエラーが出るように なりました。 (致命的なエラー C1076 コンパイラの制限 : 内部ヒープ領域の上限に達しました。領域を広げるには、/Zm オプションを使ってください。) 調べてみたところ、/Zm コンパイラオプションで コンパイラのメモリ アロケーションの領域を設定するとよいみたいでした。 ひとまず/Zmが150になっていたものを160に設定してビルドは通るようになりましたが、気がかりな点があります。 コンパイラオプションを変えることによって、何か弊害が でることはあるのでしょうか。 今回のコンパイラオプションを変えたことが原因で不具合があってはと思いまして・・・ VC++初心者なのですごく初歩的な質問をしているかもしれません。どなたか教えてください。

noname#32133
noname#32133

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

  • ベストアンサー
noname#30727
noname#30727
回答No.2

弊害は無いと思います。 歴史のある(言い換えれば設計が古い)コンパイラは、コンパイル速度優先のためか、シンボル等の増加を動的に解決しないものが多く、必要であればオプションで設定することになります。 Zmの値は、最大2,000まで指定できたはずです。VC++6.0では、100あたり100MB程度だったとの記憶があるので、メモリに余裕があれば、200や300くらいは気にはならないでしょう。

noname#32133
質問者

お礼

ありがとうございます。 ビルドは通ったのですが、結局動きませんでした。 (そのDLLを起動しようとした時点で「アドレス~で???の読み込み違反が・・・」という感じのメッセージが出てしまいました。) Zmの値を変えたことが原因でないと思いたいですが、もう少しソースをみたりとかしてみます。

その他の回答 (1)

  • isobeman
  • ベストアンサー率41% (17/41)
回答No.1

コンパイルが通れば、たぶん大丈夫かと思いますが、 大きな配列とかを新たに作成したりしていませんか? いくら沢山グローバル変数が有ったとしても、ヒープ領域の上限に達するとはかなりな量です。大きな配列とかのメモリは、動的に確保した(newとかmallocした)方がよいと思います。

noname#32133
質問者

お礼

お礼が遅くなりましたが、回答ありがとうございました。 長年使われてきたソフトでこの先10年以内?には 今私が保守しているものに代わるソフトを考えたいと いった理由で最小限の修正でつないでほしいみたいです。 結局、/Zmを200にして当分はしのぐことになりました。 VC++はまだ初心者なのでこの先も質問することがあるかも しれませんが、そのときはよろしくお願いしますm(__)m 私もここで回答を書けるようにならなくては・・・

noname#32133
質問者

補足

ありがとうございます。 配列は使っていませんが、グローバル変数が2000個くらい 定義されています。 やはりグローバル変数が多すぎるのでしょうか。

関連するQ&A

  • VC++6.0 の/Zm オプションについて

     ソースが巨大化しすぎて、エラーになるので /Zm800 と指定すると問題解決しました。  しかし、今後、さらなる巨大化が予想されるために /Zm1000 としたところ、fatal error C1060: ヒープの領域を使い果たしました。とエラーが出て困ってします。  パソコンは、メインメモリ 1GB + 仮想メモリ 10GBです。 にもかかわらずエラーが出て困っています。 http://msdn.microsoft.com/ja-jp/library/bdscwf1c(VS.80).aspx  どなたかアドバイスをよろしくお願いいたします。

  • コンパイラの制限 : ヒープの領域を使い果たしました

    最近、標準C++の勉強を始めたばかりなのですが、以前にC++で書いたプログラムのヘッダを標準C++に変更して(例えば、#include<iostream.h>を#include<iostream>に変える)コンパイルしたところ、 「コンパイラの制限 : ヒープの領域を使い果たしました; 上限を設定するために /Zm オプションを使用してください。」とのエラーがでました。このエラーは以前は出なかったもので、以前も今回もコンパイラーはVC++6.0です。なぜ、ヘッダを変えただけでこのようなエラーが出たのでしょうか。漠然とした質問で答えようがないかもしれませんが、ご存知の方いらっしゃったら教えてください。お願いします。

  • VC のビルド

    VC2005で開発しています。 あるサンプルプログラムを.slnから呼び出すと正常に作動するのですが、ファイルを集めて自分でビルドするとリンクのところでシンボルエラーが出ます。 正常に作動する方は、mainプログラムを最後にコンパイルしていますが、作動しないほうはmainプログラムからコンパイルしています。 これが理由でリンクしないのでしょうか? そうであるならどうやってビルドする順番をコンパイラに指示すればよいのでしょうか。  どなたか解答お願いします。

  • VCの使い方

    tororinnと申します。 現在、C言語の勉強をしております。 以前まではボーランド社の無償コンパイラを利用していたのですが、最近、VCを利用しております。 さて、質問ですが、 簡単に申しますとVCの使い方がわかりません。 以前、学校でVCを使っていたのですが、やり方をすっかり忘れてしまいました。 要は、ボーランドでやっていた時のように、 シンプルにコンパイラ(ビルド)をおこなった際に、 プロンプトに実行結果が出力されるのが、ベストです。 いろいろサイトを見て回って、 [新規作成]-「プロジェクト」-「win32 Application」 を選択して、 簡単な"hello"などを出力するだけのプログラムを試しに作ったのですが、 ビルドではエラーがないのに対し、 実行すると、「プログラムを実行できません」というメッセージが出てきます。 なにとぞ、よろしくお願い申し上げます。

  • 【VC++】LINK:fatal error

    VC++初心者です。 VisualC++を始めようと思い、インストールし、 Windowsフォームアプリケーションを作成したのですが、 なぜかクリックイベントを追加した途端、 ビルド時に 「LINK : fatal error LNK1104: ファイル '実行するはずのexeファイルのパス' を開くことができません」 と表示され終了してしまいます。 同じエラー番号の質問を見つけて、 Linker Tools Error LNK1104の確認し、 exeファイルが一応できていてクリックすると 「指定されたデバイス、パス、またはファイルにアクセス できません。アクセス許可が無い可能性があります。」 と表示されるので、恐らくアクセス権限が無いのでは ないかという推測はしたのですが、 どのようにアクセス権限を付与すれば良いのかが 分からず困っております。 それともそもそも違う原因なのでしょうか? 環境はWindows Vista + VisualC++2008 Express Editionです。 ごく基本的な質問になっているかもしれませんが、 ご教授いただければ幸いです。

  • VC++でcl.exeの実行エラー

    VC++6.0でビルドを行うとwarningはありますが、エラーは出てない状態で「cl.exeの実行エラー」と表示されビルドできません。どのような原因が考えられますか? 心あたりのある方、是非教えてください。

  • VC++でboolがエラーになる

    Borland C++ Builderで開発したプログラムを、訳あってVC++(2003)に乗せ変えてビルドしようとしたのですが、boolを使っているところでコンパイルエラーになります。 正確には error C2061: 構文エラー : 識別子'bool' となります。 このエラーの解決法をご存知の方がいらっしゃいましたら、ご教示お願いいたします。

  • 1つのDLLにソースを1500個ほど追加してビルドを行なったところ..

    1つのDLLにソースを1500個ほど追加してビルドを行なったところ vc60.idbが 35MBぐらいになり、以下のようなエラーが表示されてビルドが止まります。 環境:Visual C++ 6.0 x:\xxxx.cpp(19) : fatal error C1073: インクリメンタル コンパイルを伴う内部エラーが発生しました(コンパイラ ファイル '.\main.c', 行番号 629) xxxx.CPP vc60.idb削除すると、エラーが表示されなくなり最後までビルドが行なわれます。 よい知恵などありましたら、よろしくお願いいたします。

  • VC++6.0シンタックスエラーについて

    一度windowsのプログラムを半完成させていました。 その後大幅に修正するため、コードの一部を切り貼りしながら修正していたのですが、ビルドをしたとき、予想以上のエラーが発生し(50位) 原因もよくわかりませんでした。 たまたま、雑誌についていたサンプルコードをビルドしたのですが まったく同じエラーが発生するのです。 自分では、VC++が壊れたのかなと思っているのですが、 こんな現象ご存知ありませんか?

  • VC#とVC++の両方を使いたいんですが・・・

    今まではMicrosoft Visual C# 2008 Express Edition(以下VC#)だけである程度の開発を進めてきましたが、今後はOpenCVをC#で使いたいと考えています。 OpenCVに関する本やWebページを見ても、Microsoft Visual C++ 2008 Express Edition(以下VC++)を例にするものしかありませんでした。 Webページで、VC++を使って、ビルドしたあとdllファイル(?)をC#に読み込むことで、C#でOpenCVを使えるという記述を見つけたため、VC++もインストールしました。 しかしVC++をインストールする際、以下のようなコメントが出てきました。 --- コンポーネントが既に別の場所に保存されているか、別の場所に保存されたファイルに依存しているため、このコンポーネントまたはサブコンポーネントの場所を変更できません。 以下のプログラムが原因でファイルが統合されようとしています: Microsoft Visual C# 2008 Express Edition with SP1 - JPN ファイル パスを変更するには、上の一覧にあるプログラムをアンインストールしてから、Visual Studio と共有しているファイルを格納する場所に再インストールしてください。 --- もしかしたらSP1はインストールしなかったのかもしれません(チョット記憶が曖昧ですみません)。 実際、VC++でOpenCVを使ったプログラムを書いた際、ビルドは出来るものの、デバッグすると以下のようなコメントが出てしまいます。 アプリケーションを正しく初期化できませんでした(0xc0150002)。[OK]をクリックしてアプリケーションを終了してください。 これはSP1が使える状態になっていない(インストールされていない)ということなのでしょうか? 先ほども書いたとおり、VC#である程度の開発が進んでいるため、アンインストールをしてプログラムが使用不可能になってしまうことを恐れ、アンインストールをためらっています。 アンインストールと再インストールをしたとして、どこの設定を変えれば再度使えるようになるのかを教えていただけますか? あまりパソコンやVC++、VC#を詳しく知らないので、詳しく教えていただけると嬉しいです。

専門家に質問してみよう