以下のコードで 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 のケースだけです。
この問題を解決するのを手伝ってください。どんな種類の助けも大歓迎です。
前もって感謝します。