2015-08-24 28 views
1

我的程序崩溃,然后一个字符串对象被删除,我想因为我使用的是针对VS 2010编译的oracle库,而我正在使用VS 2015.下面是它崩溃的那一行:强制复制构造函数而不是移动构造函数

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

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

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

+1

可能的CRT不匹配 –

+0

如果明确使用赋值,它是否工作?如果不是,你的问题可能会在别处。 –

+2

你可以用'string f1 = const_cast (cObj.getString(MetaData :: ATTR_NAME);'强制拷贝构造函数;'但是我怀疑这样可以修复你的版本不匹配的问题 – nwp

回答

2

可执行文件和链接的DLL必须是二进制兼容的。通常他们需要由同一个编译器生成。有时候不同的编译器版本会使用相同的ABI,它可以继续工作,但不适用于您的情况。

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

有不同的方法来解决这个问题,从良好的分拣坏:

  1. 制作的版本同意升级DLL
  2. 制作的版本一致通过降级可执行
  3. 编写一个包装在正确的版本中通过套接字或管道暴露功能
  4. 请勿使用返回带动态内存对象的函数
  5. 内存泄漏

在Visual Studio的情况下,你可以安装在旧的和Visual Studio的新版本,去Solution ExplorerConfiguration PropertiesGeneralPlatform Toolsetselect the old platform在新版本中。

请注意,降级目标平台会导致新功能不可用。

+0

谢谢你的回答:) – Silencer