0

当我尝试在下面的代码中调用 SetName() 时,我的应用程序崩溃了。

主文件

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以Debug模式构建并且我的应用程序也以Debug模式构建时结果:应用程序执行成功

2.当共享库/dll以Release模式构建并且我的应用程序也以Release模式构建时结果:应用程序执行成功

3.当共享库/dll 在发布模式下构建并且我的应用程序在调试模式下构建时结果:应用程序抛出带有以下中断语句的崩溃报告。

multiple.exe 中 0x1003f3a5 处的未处理异常:0xC0000005:访问冲突读取位置 0x00134000。

注意:上面的代码只是我的应用程序的一部分。架构类定义来自共享库和我的应用程序中的 main.cpp。此外,这个问题似乎只在 Windows 上失败,unix 版本运行良好。

更重要的一件事,如果我在 main.cpp 中注释掉schemaExp -> SetName("ExpSchema");,应用程序在上述三种情况下通过,我的意思是发布和调试构建的任意组合

在我的原始应用程序的整个代码中(上面的代码是其中的一部分),只有上面的函数调用困扰着我

我猜在使用字符串作为函数调用的参数时出了点问题,但还要注意当我编写实现上述场景的示例程序(未链接到共享库/dll)时,我的应用程序运行良好

彻底击中这里。仅在 #3 情况下,也无法预测发生了什么问题以及导致访问冲突的原因。

请帮我解决这个问题。非常感谢任何形式的帮助。

提前致谢。

4

1 回答 1

0

这是我所期望的。考虑:

  • 调试版本和发布版本在后台使用不同的运行时库。因此,根据您选择的构建,分配和释放内存的方式会有所不同。

  • 如果您没有声明要导入或导出的构造函数或析构函数,那么它们将自动生成并使用包含共享库的项目构建的运行时。

  • 根据构建类型,可能会设置或不设置某些宏。例如,NDEBUG宏通常设置为发布模式。这不仅影响函数(和断言),有时甚至影响数据结构的大小。例如,如果您有一个经过检查的 STL 实现,则容器的迭代器可能会存储指向其容器的指针以进行内部有效性检查。

如您所见,混合使用 Debug 和 Release 并不是一件好事。尽可能避免它。

于 2013-07-17T08:18:11.540 回答