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

Forcing the copy constructor instead of the move constructor

本文关键字:构造函数 移动 复制      更新时间:2023-10-16

我的程序崩溃然后字符串对象被删除,我想是因为我使用VS 2010编译的oracle库,而我使用VS 2015。下面是崩溃的那行:

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

我得到一个正常的字符串,我可以使用它,但当它超出范围时,它会崩溃,试图释放。现在,当阅读关于使用旧版本DLL的文章时,我读到如果内存分配发生在DLL库中,我们应该始终将内存的释放留给DLL。我想这里发生的是move构造函数被调用,所以在结束时,它试图释放由oracle dll分配的内存字符串。

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

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

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

有不同的方法来解决这个问题,从好的到坏的排序:

  1. 通过升级DLL使版本一致
  2. 通过降级可执行文件
  3. 使版本一致
  4. 用正确的版本编写包装器,通过套接字或管道公开功能
  5. 不要使用返回动态内存对象的函数
  6. 内存泄漏

如果是Visual Studio,你可以安装新旧版本的Visual Studio,进入Solution Explorer, Configuration Properties, General, Platform Toolset,并在新版本中选择旧平台。

请注意,降级目标平台将使新功能不可用。