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