【发布时间】:2015-08-24 12:26:06
【问题描述】:
我的程序崩溃然后一个字符串对象被删除,我想是因为我使用为 VS 2010 编译的 oracle 库,而我使用的是 VS 2015。这是它崩溃的行:
string f1 = cObj.getString(MetaData::ATTR_NAME);
我得到一个正常的字符串,我可以使用它,但是当它超出范围时,它会在尝试解除分配时崩溃。 现在,在阅读有关使用旧版本 DLL 的信息时,我读到如果分配发生在该库内部,我们应该始终将内存释放留给 DLL。我想这里发生的是调用了移动构造函数,所以最后它尝试解除分配由 oracle dll 分配的内存的字符串。
所以我的问题是,有没有办法在这种情况下显式调用字符串的复制构造函数?
【问题讨论】:
-
CRT 可能不匹配
-
明确使用赋值是否有效?如果不是,您的问题可能出在其他地方。
-
您可以使用
string f1 = const_cast<const string &>(cObj.getString(MetaData::ATTR_NAME);强制复制构造函数,但我怀疑这可以解决您的版本不匹配问题。 -
@nwp,奇怪,现在 deallocate get 在你的行之后被调用并且程序崩溃了,所以这意味着有临时对象被破坏 - 这意味着问题可能不在移动构造函数中?所有这些函数调用都不会发生这种情况,所以很难理解这些 CRT 的东西......
-
我会尝试找到 VS2015 版本的 dll。如果不可用,您可以安装 VS2010 并在 VS2015 中选择 VS2010 套件。如果这也不可行,请在 VS2010 中编写一个包装器,通过套接字或管道公开 DLL 函数。一些不好的可能性是不使用返回具有动态内存的对象的函数或泄漏它们的内存。
标签: c++ copy-constructor move-constructor