强制复制构造函数而不是移动构造函数

时间:2015-08-24 12:26:07

标签: c++ copy-constructor move-constructor

我的程序崩溃,然后一个字符串对象被删除,我想因为我使用为VS 2010编译的oracle库,而我正在使用VS 2015.这是它崩溃的行:

string f1 = cObj.getString(MetaData::ATTR_NAME);

我得到一个正常的字符串,我可以使用它,但是当它超出范围时,它会崩溃尝试解除分配。 现在,当阅读有关使用旧版本DLL的内容时,我读到如果在该库内发生分配,我们应该始终将内存释放到DLL中。我想在这里发生的是移动构造函数被调用,所以最后它尝试释放具有由oracle dll分配的内存的字符串。

所以我的问题是,在这种情况下有没有办法显式调用字符串的复制构造函数?

1 个答案:

答案 0 :(得分:3)

可执行文件和链接的DLL必须是二进制兼容的。通常它们需要由相同的编译器生成。有时不同的编译器版本使用相同的ABI并继续工作,但不是在你的情况下。

ABI定义了如何分配和释放内存,DLL和可执行文件对其工作方式有不同的假设,因此崩溃。

有许多方法可以解决这个问题,从好到坏排序:

  1. 通过升级DLL使版本达成一致
  2. 通过降级可执行文件使版本达成一致
  3. 以正确的版本编写包装器以通过套接字或管道公开功能
  4. 不要使用返回具有动态内存的对象的函数
  5. 泄漏内存
  6. 如果是Visual Studio,您可以安装旧版和新版Visual Studio,转到Solution ExplorerConfiguration PropertiesGeneralPlatform Toolset和{{3在新版本中。

    请注意,降级目标平台会使新功能无法使用。