我的程序崩溃,然后一个字符串对象被删除,我想因为我使用为VS 2010编译的oracle库,而我正在使用VS 2015.这是它崩溃的行:
string f1 = cObj.getString(MetaData::ATTR_NAME);
我得到一个正常的字符串,我可以使用它,但是当它超出范围时,它会崩溃尝试解除分配。 现在,当阅读有关使用旧版本DLL的内容时,我读到如果在该库内发生分配,我们应该始终将内存释放到DLL中。我想在这里发生的是移动构造函数被调用,所以最后它尝试释放具有由oracle dll分配的内存的字符串。
所以我的问题是,在这种情况下有没有办法显式调用字符串的复制构造函数?
答案 0 :(得分:3)
可执行文件和链接的DLL必须是二进制兼容的。通常它们需要由相同的编译器生成。有时不同的编译器版本使用相同的ABI并继续工作,但不是在你的情况下。
ABI定义了如何分配和释放内存,DLL和可执行文件对其工作方式有不同的假设,因此崩溃。
有许多方法可以解决这个问题,从好到坏排序:
如果是Visual Studio,您可以安装旧版和新版Visual Studio,转到Solution Explorer
,Configuration Properties
,General
,Platform Toolset
和{{3在新版本中。
请注意,降级目标平台会使新功能无法使用。