当我尝试在下面的代码中调用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在调试模式下构建时,我的应用程序也在调试模式下构建 结果:应用程序已成功执行
2.当共享库/ dll在发布模式下构建时,我的应用程序也在发布模式下构建 结果:应用程序已成功执行
3.当共享库/ dll在发布模式下构建并且我的应用程序在Debug 模式下构建时 结果:应用程序将使用以下break语句抛出崩溃报告。
multiple.exe中0x1003f3a5处的未处理异常:0xC0000005:访问冲突读取位置0x00134000。
注意:上面的代码只是我的应用程序的一部分。 架构类定义来自我的应用程序的共享库和main.cpp。此外,这个问题似乎只在Windows上失败,unix版本工作正常。
如果我在main.cpp中注释掉schemaExp -> SetName("ExpSchema");
,应用程序会在上述三种情况下传递,我的意思是发布和调试版本的任意组合
在原始应用程序的整个代码中(上面的代码是其中的一部分),只有上面的函数调用让我很烦恼
我想在使用字符串作为函数调用的参数时会出现问题,但是当我编写示例程序(不链接到共享库/ dll)时,请注意实现上述场景我的应用程序运行良好
完全击中了这里。无法预测出现了什么问题以及导致访问违规的原因仅在#3案例中。
请帮我解决这个问题。非常感谢任何形式的帮助。
提前致谢。
答案 0 :(得分:0)
这是我所期待的。考虑:
调试版本和发布版本在后台使用不同的运行时库。因此,根据您选择的构建,分配和释放内存将以不同方式完成。
如果您没有声明要导入或导出的构造函数或析构函数,那么它们将自动生成并使用包含共享库的构建项目的运行时。
根据构建类型,可能会设置某些宏。例如,NDEBUG
宏通常设置为发布模式。这不仅影响函数(和断言),有时甚至影响数据结构的大小。例如,如果您有一个已检查的STL实现,那么容器的迭代器可以存储指向其容器的指针以进行内部有效性检查。
正如您所看到的,混合使用Debug和Release并不是一件好事。如果可能的话,尽量避免它。