强制使用复制构造函数而不是移动构造函数
Forcing the copy constructor instead of the move constructor
我的程序崩溃然后字符串对象被删除,我想是因为我使用VS 2010编译的oracle库,而我使用VS 2015。下面是崩溃的那行:
string f1 = cObj.getString(MetaData::ATTR_NAME);
我得到一个正常的字符串,我可以使用它,但当它超出范围时,它会崩溃,试图释放。现在,当阅读关于使用旧版本DLL的文章时,我读到如果内存分配发生在DLL库中,我们应该始终将内存的释放留给DLL。我想这里发生的是move构造函数被调用,所以在结束时,它试图释放由oracle dll分配的内存字符串。
我的问题是,在这种情况下,是否有一种方法可以显式调用字符串的复制构造函数?
可执行文件和链接的DLL必须是二进制兼容的。一般来说,它们需要由同一个编译器生成。有时不同的编译器版本使用相同的ABI,但它保持工作,但不是在你的情况下。
ABI定义了如何分配和释放内存,DLL和可执行文件对如何工作有不同的假设,因此崩溃。
有不同的方法来解决这个问题,从好的到坏的排序:
- 通过升级DLL使版本一致
- 通过降级可执行文件 使版本一致
- 用正确的版本编写包装器,通过套接字或管道公开功能
- 不要使用返回动态内存对象的函数
- 内存泄漏
如果是Visual Studio,你可以安装新旧版本的Visual Studio,进入Solution Explorer
, Configuration Properties
, General
, Platform Toolset
,并在新版本中选择旧平台。
请注意,降级目标平台将使新功能不可用。
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么调用复制构造函数而不是移动构造函数?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 具有已删除移动和复制构造函数的类的就地构造
- 移动构造函数和右值引用
- 使用移动调用对等构造函数unique_ptr默认构造函数
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 构造函数采用std::string_view与std::string并移动
- C++:为什么不调用移动构造函数?
- 了解构造函数在移动、复制、赋值语义中的行为
- 没有移动的构造函数移动课程
- 引用绑定和复制构造函数/移动构造函数
- 构造函数移动
- C++ 向量实现 - 移动构造函数 - 移动与前进
- 我真的必须取消移动构造函数/移动结构中的所有成员还是只是指针
- 将类(没有默认构造函数)移动到另一个类的move构造函数中