none
std::string定義時のアクセス違反の対処法について教えてください。 RRS feed

  • 質問

  • Visual Studio 2013で過去に別の人が開発したプログラムの改修中です。

    ビルドは出来るのですが、実行時に
    std::string ifs;
    の行で、

    ハンドルされない例外が 0x772E33DD(ntdll.dll)で発生しました。
    (XXXX.EXE 内): 0xC0000005:場所 0xFEFEFF06の読み取り中にアクセス違反が発生しました。
    のエラーが発生してしまいます。。

    似たようなプログラムからの関数の流用で、流用元では動作していたコードです。
    変数の定義のところでエラーになってしまいデバッグに行き詰ってしまいました。

    このエラーはどの様に対処したらよいか、ご教授いただけませんでしょうか?
    2016年3月11日 8:35

回答

  • 早速のご返信ありがとうございます。

    エントリーポイントがWinMainとのことですのでCRTの初期化は行われていると思います。
    申し訳ないのですが原因を特定できない状態です。

    以下を行うことで原因を絞り込むことができるかもしれません。

    • ランタイムライブラリを「マルチスレッド デバッグ DLL」にして再現するか
    • 全く新しいプロジェクトを作成し、同じプロジェクト設定にして最小のソースコード(std:stringを定義するだけ)で再現するか
    • 再現しているプロジェクトのソースを、再現できる状態を維持したまま、なるべく小さくして原因を絞り込む(ここに貼りつけられるレベルにまで落とし込めば詳細なアドバイスができるかもしれません)

    以上よろしくお願いいたします。



    • 編集済み kenjinoteMVP 2016年3月14日 4:59
    • 回答としてマーク lga_im 2016年3月15日 0:50
    2016年3月14日 4:48

すべての返信

  • 情報が少ないので、的を得ていないかもしれませんが

    CRTの初期化をしなかった場合はstd::stringの定義で例外が発生することがあります。

    エントリーポイントはどうなっていますでしょうか?(例:main、_mainCRTStartup、WinMain、WinMainCRTStartupなど)
    std::stringの定義の場所はメインスレッドでしょうか、それともワーカースレッドでしょうか?
    プロジェクトのプロパティで「構成プロパティ」→「C/C++」→「コード生成」の「ランタイムライブラリ」の設定はどのようになっていますでしょうか?

    #include <windows.h>
    #include <string>
    
    EXTERN_C void __cdecl WinMainCRTStartup()
    {
            std::string ifs;//ココで例外発生
            ifs = "hoge";
            ExitProcess(0);
    }




    2016年3月11日 9:20
  • 情報が少ないので、的を得ていないかもしれませんが

    CRTの初期化をしなかった場合はstd::stringの定義で例外が発生することがあります。

    エントリーポイントはどうなっていますでしょうか?(例:main、_mainCRTStartup、WinMain、WinMainCRTStartupなど)
    std::stringの定義の場所はメインスレッドでしょうか、それともワーカースレッドでしょうか?
    プロジェクトのプロパティで「構成プロパティ」→「C/C++」→「コード生成」の「ランタイムライブラリ」の設定はどのようになっていますでしょうか?

    #include <windows.h>
    #include <string>
    
    EXTERN_C void __cdecl WinMainCRTStartup()
    {
            std::string ifs;//ココで例外発生
            ifs = "hoge";
            ExitProcess(0);
    }




    ご回答ありがとうございます。
    不慣れで正しく読めていないかもしれませんが、
    『AfxBeginThread』の記述は無いので、CRTの初期化はやってないようです。

    >エントリーポイントはどうなっていますでしょうか?
     『WinMain』です。
    >std::stringの定義の場所はメインスレッドでしょうか、それともワーカースレッドでしょうか?
    メインスレッドです。このコードの少し前で、CreateProcessで作成したプロセスは終了しています。


    > プロジェクトのプロパティで「構成プロパティ」→「C/C++」→「コード生成」の「ランタイムライブラリ」の設定はどのようになっていますでしょうか?

    マルチスレッド デバッグ (/MTd)
    です。

    対応方法はどの様にすればよいのでしょうか?。
    2016年3月14日 3:02
  • 早速のご返信ありがとうございます。

    エントリーポイントがWinMainとのことですのでCRTの初期化は行われていると思います。
    申し訳ないのですが原因を特定できない状態です。

    以下を行うことで原因を絞り込むことができるかもしれません。

    • ランタイムライブラリを「マルチスレッド デバッグ DLL」にして再現するか
    • 全く新しいプロジェクトを作成し、同じプロジェクト設定にして最小のソースコード(std:stringを定義するだけ)で再現するか
    • 再現しているプロジェクトのソースを、再現できる状態を維持したまま、なるべく小さくして原因を絞り込む(ここに貼りつけられるレベルにまで落とし込めば詳細なアドバイスができるかもしれません)

    以上よろしくお願いいたします。



    • 編集済み kenjinoteMVP 2016年3月14日 4:59
    • 回答としてマーク lga_im 2016年3月15日 0:50
    2016年3月14日 4:48
  • 早速のご返信ありがとうございます。

    エントリーポイントがWinMainとのことですのでCRTの初期化は行われていると思います。
    申し訳ないのですが原因を特定できない状態です。

    以下を行うことで原因を絞り込むことができるかもしれません。

    • ランタイムライブラリを「マルチスレッド デバッグ DLL」にして再現するか
    • 全く新しいプロジェクトを作成し、同じプロジェクト設定にして最小のソースコード(std:stringを定義するだけ)で再現するか
    • 再現しているプロジェクトのソースを、再現できる状態を維持したまま、なるべく小さくして原因を絞り込む(ここに貼りつけられるレベルにまで落とし込めば詳細なアドバイスができるかもしれません)

    以上よろしくお願いいたします。



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

    ランタイムライブラリを「マルチスレッド デバッグ DLL」にして再現するか

    「マルチスレッド デバッグ DLL」にすると再現せず、意図通りに動作しました。

    マルチスレッド』で進めようと思います。

    ありがとうございました。


    2016年3月15日 0:50