マンガでよめる痔のこと・薬のこと

現在、VisualStudio .NET 2003 にてC++でプログラミングを行っているのですが、
[デバッグ→開始]で実行しますとエラーは起こらず実行できるのですが、[デバッグ→デバッグなしで開始]を行うとオーバーフローエラーが起きるという現象に苦しんでいます。

両者の違いはデバッグ用のソースコードを埋め込むか埋め込まないかだけの違いだと思っているもので、いまいち納得ができていません。
(特にデバッグ時に、このエラーを検知できない所が)

このような現象は、よくあることなのでしょうか?
もしもあるのでしたら対策方法などを教えていただけましたら幸いです?

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

A 回答 (2件)

デバッグモードだと変数初期化がされますが、デバッグ無しですと初期化されません。


よって、変数の初期化漏れがあると思われます
    • good
    • 2
この回答へのお礼

デバッグモードと、デバッグ無しモードではそんな違いがあったのですね。勉強になりました。これを機に、VisualStudioについてもっと勉強してみたいと思います。ありがとうございました。

お礼日時:2006/03/27 02:57

下記の URL の 15.6 に関連する情報があります。


実は、「デバッグ無しで行うとエラーになる」と認識するのが間違いで、「デバッグ有りだと、偶然エラーが表面化しない」という認識が正解です。
CやC++は得てしてそういうものです。

参考URL:http://www.kouno.jp/home/c_faq/c16.html#0
    • good
    • 0
この回答へのお礼

視点の変更ですか、なるほどです。
教えていただきましたURLの情報は勉強になりました。
ありがとうございます。

お礼日時:2006/03/27 02:59

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

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

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

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

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

Qリリース実行やExe実行で動作が異なる

質問です。

Microsoft Visual Studio 2008 Professional Edition - JPN
Microsoft DirectX SDK (August 2007)

上記の環境で開発を行っているのですが、
Debug実行、Release実行、Exe実行で動作ができなくなることが
あるのですが、原因はなんなんでしょうか?
ご教授御願い致します。

特にコンパイル環境の設定を変更したわけではなく、
リリース環境も"最大限に最適化"のみとなっています。
フォルダパス等も間違っておらず、DirectXの描画が不正となります。

基本的にDebug実行では、問題なく、リリース環境とExe実行に問題が発生します。
原因は、環境構築の違いからくるものだと思うのですが、
解決するには、どうすればよいのでしょうか?
また、他の問題があるのでしょうか?

宜しく御願い致します。

Aベストアンサー

リリース環境のみに起こるバグというのはよくあることです。

そういう場合、releaseビルドでもファイルにログを出力したり、WindowsならOutputDebugStringで
追跡できるようにしておくとよいでしょう。
(define1つでログ出力のオン/オフが出来るようにしておくと便利です。)

>DirectXの描画が不正となります
上記の方法でログをとりHRESULTの値等がどうなっているか調べてください。

Qデバッグとビルドは何が違うのですか?

コード編集画面にて、
・デバッグの開始
・ビルド
がありますが、
デバッグの開始をした場合もビルドはされますよね?

という事は、デバッグ=ビルドでもあるのですか?

Aベストアンサー

ビルドは、コンパイルその他、目的のものを生成する作業のこと。
Visual Basicなら、ソースコードをコンパイルして.exeや.dllを生成します。

デバッグは、プログラムにある問題(バグ)を取り除く作業のこと。
デバッグ方法は沢山ありますが、そのうちの一つが「デバッガ」と呼ばれる支援ツールを使う方法。
これは、実際にプログラムを動作させながら、途中で止めて変数の内容を確認/変更したり、1命令ずつ実行して期待した順番に実行されているか確かめたりします。

この2つは、まったく別のものです。


デバッガでデバッグするためには、プログラムを動作させる必要があります。
Visual Basicの場合、プログラムを動作させるために、ソースコードからビルドする必要があります。

ソースコードを編集しても、ビルドしなければ、デバッガが使うのは「古いソースコードからビルドされた実行プログラム」になってしまい、デバッグ作業が無意味になります。

このため、Visual Studio では、デバッガを使うときに、ソースコードとビルド後のファイルを確認して、必要ならビルドするようになっています。

「デバッグの開始」を詳しく書けば「ソースコードが新しいなどでビルドの必要があるならばビルドして、その後に、デバッグを開始」となるでしょう

ビルドは、コンパイルその他、目的のものを生成する作業のこと。
Visual Basicなら、ソースコードをコンパイルして.exeや.dllを生成します。

デバッグは、プログラムにある問題(バグ)を取り除く作業のこと。
デバッグ方法は沢山ありますが、そのうちの一つが「デバッガ」と呼ばれる支援ツールを使う方法。
これは、実際にプログラムを動作させながら、途中で止めて変数の内容を確認/変更したり、1命令ずつ実行して期待した順番に実行されているか確かめたりします。

この2つは、まったく別のものです。


デバッ...続きを読む

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

Qfopne で失敗する原因

fopenで失敗する原因とはなんですか?

Aベストアンサー

#1の方の回答に加えて...

・ファイル名の文字列がでたらめ(存在するかどうか以前の問題)
・指定したファイル名が実はディレクトリだった。
・ファイル名に空ポインタまたは不正なポインタを渡した。
・オープンモードに空ポインタまたは不正なポインタを渡した。
・オープンモードの形式が不正
・メモリ不足でバッファ(実装によってはファイル記述子も)の割り付けに失敗した。
・同名の関数またはマクロをユーザーが定義した。
・関数原型なしで呼び出した。
・他のスレッド等で、同じファイルに対する操作中(再入可能とは限らないので)

Qリリースモードとデバッグモードの違い (具体的な違い)

DebugとReleaseモードで作成された実行ファイルの速度の違いですが、
一般的にどれくらいの差があるのでしょうか?(だいたいn%遅いとか)

リリースモードの場合は最適化も行われるということですがデバッグモードは何か付加されるのでしょうか?

このあたりの理解をしっかりしたいのですが、参考になる書籍をご存知の方、教えてください。

Aベストアンサー

とりあえず,Visual C++を前提に話を進めます。


> DebugとReleaseモードで作成された実行ファイルの速度の違いですが、
> 一般的にどれくらいの差があるのでしょうか?(だいたいn%遅いとか)

内容次第です。

極端な例ですが,
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{ return MessageBoxA(0, "Hello, World!", "", MB_OK); }
について,どれだけの差があるかと言われても,まずないでしょう。
# ついでに,リンカオプションでWinMainを本当のエントリポイントにすると効果的。

差が付く可能性があるのは,自分の書いたコードがCPUを相手に頑張る場合です。
その,非常に局所的な部分だけを見れば,何倍とかもあり得るでしょうが (実行時の計算を省くので∞,なんてこともある),
全体で見ると,数値計算を主とするプログラムを除いて,大した数字にはならないと思います。
# コンパイラの支配下から外れる部分が大半になるでしょうし。

MSDN : タイムクリティカルなコードを最適化するためのヒント
http://msdn.microsoft.com/ja-jp/library/eye126ky.aspx
などにもありますが,結局は「キャッシュミスやページフォールトを減らす」が一番効果的だったりします。
もちろん,最適化オプションによってコードが小さくなったり重複する定数がまとめられたりして局所化が進む分減るでしょうが,


> リリースモードの場合は最適化も行われるということですがデバッグモードは何か付加されるのでしょうか?

MSDN : リリースビルドの作成
http://msdn.microsoft.com/ja-jp/library/cc367889.aspx
を読んでください。デフォルトの「リリースビルド」構成において,「デバッグビルド」構成に比べて何が行われるのか書いてあります。
なお,ビルド構成は任意に作成できる物なので,デバッグ情報を付加して最適化オプションを有効化することもできます。

とりあえず,Visual C++を前提に話を進めます。


> DebugとReleaseモードで作成された実行ファイルの速度の違いですが、
> 一般的にどれくらいの差があるのでしょうか?(だいたいn%遅いとか)

内容次第です。

極端な例ですが,
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{ return MessageBoxA(0, "Hello, World!", "", MB_OK); }
について,どれだけの差があるかと言われても,まずないでしょう。
# ついでに,リンカオプションでWinMainを本当の...続きを読む

QC#で共有変数の定義をするには

C#で共有変数の定義をするには、どうしたらよいでしょうか。具体的には、起動パラメータで、任意の文字列(3~4バイト)を渡して、C#アプリケーションを、起動し、プログラムの任意の場所で、そのパラメータを参照したいと考えています。起動パラメータの受け取りは、できるのですが、そのパラメータを、プログラムのどこからも参照できる領域(ここの定義方法が不明)に格納するには、どうしたらよいでしょうか。(2重起動を許す前提です。実行時に1つの目のプログラムにはパラメータ"XYZ"を渡し、2つ目のプログラムを起動時にはパラメータ"ABCD"を渡し、その値により、プログラムの動作を制御したいと思っています)
Windows-xp visual-studio2008 C#でwindowsアプリケーションを作成しています。

Aベストアンサー

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
    // ここに記述
    static public string strArg = null;
  }
}

メインクラスのメンバーとしてスコープが有効な場所に記述します

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(n...続きを読む

QDebug Assertion Failed?

プログラムを実行したら、

Debug Assertion Failed

Expressin:(stream!=NULL)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation asserts.

(Press Retry to debug the application)

と表示されるエラーが発生しました。(添付画像参照)

エラーの対処方法がわかりません。
ご存知の方がいたら教えていただけないでしょうか?

なお、プログラムでは複数のバイナリーデータから必要な情報を抽出、計算して、各バイナリーデータごとにCSVファイルにデータを出力していました。
また、特定のファイルでエラーが発生するわけではありません。


よろしくお願いします。

Aベストアンサー

fread.cでstream!=NULLのAssertに引っ掛かった訳ですから、コード中のfread()に渡すFILE *がNULLになっている、という事でしょう。
エラーメッセージだけで推測できるのはここまでですから、あとはどこで「うっかりNULLを入れていて」「そのままfread()を呼んでしまっている」のかを特定する必要があります。

QVisual C++にて「再定義されています」と…

VisualC++2010にて、OpenCVを導入しようといろいろ弄っていたら以下のような文章が出るようになりました。


1>------ ビルド開始: プロジェクト: imiwakaran, 構成: Debug Win32 ------
1> stdafx.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(27): error C2371: 'size_t' : 再定義されています。異なる基本型です。
1> c:\users\ooka\documents\visual studio 2010\projects\imiwakaran\imiwakaran\predefined c++ types (compiler internal)(19) : 'size_t' の宣言を確認してください。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========


再定義されているとのことなので書き換えようとしましたが、書き換えが不可能なファイルでした。
これのせいでHellow Worldすら実行できなくなりました。

Visual系のソフトをすべてアンインストールして、再インストールしましたが現状のままでした。
どなたか詳しい方、どうかお助けください。

VisualC++2010にて、OpenCVを導入しようといろいろ弄っていたら以下のような文章が出るようになりました。


1>------ ビルド開始: プロジェクト: imiwakaran, 構成: Debug Win32 ------
1> stdafx.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(27): error C2371: 'size_t' : 再定義されています。異なる基本型です。
1> c:\users\ooka\documents\visual studio 2010\projects\imiwakaran\imiwakaran\predefined c++ types (compiler inter...続きを読む

Aベストアンサー

>OpenCVを導入しようといろいろ弄っていた

が、具体的になにをしたんでしょうか?

microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(27)
だと…

#ifndef _SIZE_T_DEFINED
#ifdef _WIN64
typedef unsigned __int64 size_t;
#else
typedef _W64 unsigned int size_t;
#endif
#define _SIZE_T_DEFINED
#endif

の上側のtypedefが19行目になると思われますが、
そこが有効になるということは_WIN64が定義されている。
ということになります。

が…
>1>------ ビルド開始: プロジェクト: imiwakaran, 構成: Debug Win32 ------
でWin32となっている以上、_WIN64が定義されているのはおかしい。ということになりますけど……。


>これのせいでHellow Worldすら実行できなくなりました。

新しいソリューションを作成しても…ですか?

>OpenCVを導入しようといろいろ弄っていた

が、具体的になにをしたんでしょうか?

microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(27)
だと…

#ifndef _SIZE_T_DEFINED
#ifdef _WIN64
typedef unsigned __int64 size_t;
#else
typedef _W64 unsigned int size_t;
#endif
#define _SIZE_T_DEFINED
#endif

の上側のtypedefが19行目になると思われますが、
そこが有効になるということは_WIN64が定義されている。
ということになります。

が…
>1>------ ビルド開始: プロジェ...続きを読む

QVC++でDeugモードOKで、Releaseモードのみでエラーが出る?

マイクロソフトのVisualC++で
テキストデータを処理するプログラミングしています。
(MFCは使っていません。)

使用してたプログラムの
一部の変数をクラス化しました。

数多くのエラーをかいくぐり、
Debugモードでは、
目的の演算を実行することができるようになりました。

ところが、
このプロジェクトをReleaseモードでビルド実行すると、

「trans1.exe の 0x0040d052 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x2eb11a94 に書き込み中にアクセス違反が発生しました。」

というエラーが出て止まってしまいます。

プロジェクトのプロパティ設定で、
ヒープ領域をDebugモードと
同じにしてみたりしたのですが、
状況は改善されません。

メモリの問題のような気がして、
配列の大きさ等をチェックしましたが、
問題なしでした。

プログラムを他の人が使えるように
するためには、
Releaseモードが必要なので困っています。

どなたか、アドバイスかご教示お願いします。
デバッグ方法を教えて頂いても大変助かります。

よろしくお願いします。

マイクロソフトのVisualC++で
テキストデータを処理するプログラミングしています。
(MFCは使っていません。)

使用してたプログラムの
一部の変数をクラス化しました。

数多くのエラーをかいくぐり、
Debugモードでは、
目的の演算を実行することができるようになりました。

ところが、
このプロジェクトをReleaseモードでビルド実行すると、

「trans1.exe の 0x0040d052 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x2eb11a94 に書き込み中にアクセス違反が発生しました...続きを読む

Aベストアンサー

まずメモリ周りの不具合でしょうね。
Debug 版は各領域の配置間隔に余裕が有るので、少しはみ出した程度
なら平気で動きます。

テキストデータ処理で思い浮かぶチェック事項を挙げてみます。

・文字列は全て終端 '\0' で止めてあるか
 Debug 版は各領域の間に余裕が有る為、バッファ外で '\0' を拾って
 助かっている可能性が有ります。

・strcpy, strcat, sprintf
 上記またはこれらと同等のAPIで、受け側の大きさは足りているか
 (バッファサイズは問題無いとのことでしたが…)

・動的バッファのポインタや各種ハンドルを多重解放していないか
 free や close 系は NULL 以外で実行、実行したらポインタに NULL
 を代入、としておけば間違いは減りますね。

マルチスレッド環境なら
・共有領域に排他制御が施されているか
・スレッド間で処理順序に依存する部分は同期処理が施されているか
・strtok 等、そのままではマルチで使えない関数を使っていないか

先ずはこんな所かな…

必ず再現する障害のデバッグ方法として、Release 版で手軽なのは
トレースログですね。
適当な所に通過確認とバッファの内容確認を兼ねてログやメッセージ
ボックスを仕掛けます。
しかし、最初から全体に事細かにログを仕掛けると厳しいです。
コツは処理の中間地点に仕掛けて、それより前半か後半かを特定。
次はまた特定された側の中間にログを…、と段々と囲い込みます。

但し、ログを仕込んだ事で領域の配置が変わり、障害が発生しなく
なるという罠も希に有ります。心の片隅にでも留めておいて下さい。

まずメモリ周りの不具合でしょうね。
Debug 版は各領域の配置間隔に余裕が有るので、少しはみ出した程度
なら平気で動きます。

テキストデータ処理で思い浮かぶチェック事項を挙げてみます。

・文字列は全て終端 '\0' で止めてあるか
 Debug 版は各領域の間に余裕が有る為、バッファ外で '\0' を拾って
 助かっている可能性が有ります。

・strcpy, strcat, sprintf
 上記またはこれらと同等のAPIで、受け側の大きさは足りているか
 (バッファサイズは問題無いとのことでしたが…)

・動的...続きを読む


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

人気Q&Aランキング

おすすめ情報