0

以下のコードで SetName() を呼び出そうとすると、アプリケーションがクラッシュします。

main.cpp

using namespace std;
int main()
{ 
    Schema * schemaExp = new Schema();

    //Application is getting crash when calling this function 
    schemaExp -> SetName("ExpSchema");

    string srctable;
    srctable=schemaExp->GetName();
    cout <<"\nConnection EXPORT using the target table:" << srctable.c_str()  << endl;
    delete schemaExp;
    return 0;
}

スキーマ クラスの定義:

using namespace std;
class Schema
{
   public:
   TELAPI_EXPORT void   SetName(string name); 
   TELAPI_EXPORT string     GetName(); 
   protected: 
   string tableName; 
};

void Schema::SetName(string name){ tableName = name; }

string Schema::GetName()
{
  return tableName;
}

MSVS 9 (VS 2008) を使用しています。私のアプリケーションと共有ライブラリ(dll)(アプリケーションとのリンクに使用しています)もc ++環境です。以下のケースを観察してください:

1.共有ライブラリ/dll がデバッグ モードでビルドされ、アプリケーションもデバッグ モードでビルドされている場合 結果: アプリケーションは正常に実行されました

2.共有ライブラリ/dll がリリース モードでビルドされ、アプリケーションもリリース モードでビルドされている場合 結果: アプリケーションは正常に実行されました

3.共有ライブラリ/dll がリリース モードでビルドされ、アプリケーションがデバッグモードでビルドされると、結果:アプリケーションは次の break ステートメントを含むクラッシュ レポートをスローします。

multiple.exe の 0x1003f3a5 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00134000。

注: 上記のコードは、私のアプリケーションの一部です。Schema Class Definition は共有ライブラリから、main.cpp はアプリケーションからのものです。また、この問題は Windows でのみ失敗するようで、UNIX バージョンでは問題なく動作しました。

schemaExp -> SetName("ExpSchema");main.cpp でコメントアウトする場合のもう 1 つの重要な点は、アプリケーションが上記の 3 つのケースでパスすることです。つまり、リリース ビルドとデバッグ ビルドの任意の組み合わせを意味します。

私の元のアプリケーションのコード全体(上記のコードはその一部です)では、上記の関数呼び出しだけが私を悩ませています

関数呼び出しのパラメーターとして文字列を使用する際に何か問題が発生していると思いますが、上記のシナリオを実装するサンプル プログラム (共有ライブラリ/dll にリンクしていない) を作成したときに、アプリケーションが正常に動作することにも注意してください。

ここで完全に打ちました。何がうまくいかないのか、何がアクセス違反を引き起こしているのかを予測できないのは、#3 のケースだけです。

この問題を解決するのを手伝ってください。どんな種類の助けも大歓迎です。

前もって感謝します。

4

1 に答える 1

0

これは私が期待するものです。検討:

  • デバッグ ビルドとリリース ビルドは、バックグラウンドで異なるランタイム ライブラリを使用します。たとえば、メモリの割り当てと解放は、選択したビルドによって異なります。

  • インポートまたはエクスポートするコンストラクタまたはデストラクタを宣言しない場合、それらは自動生成され、共有ライブラリを含むプロジェクトのビルドに使用されるランタイムが使用されます。

  • ビルドの種類によって、特定のマクロが設定されている場合とされていない場合があります。たとえば、NDEBUG通常、マクロはリリース モードに設定されます。これは、関数 (およびアサーション) だけでなく、場合によってはデータ構造のサイズにも影響します。たとえば、チェック済みの STL 実装がある場合、コンテナーの反復子は、内部の有効性チェックのためにコンテナーへのポインターを格納できます。

ご覧のとおり、Debug と Release を混在させることは良いことではありません。可能であれば、それを避けてください。

于 2013-07-17T08:18:11.540 に答える