【发布时间】:2010-11-13 01:46:23
【问题描述】:
在我的应用程序中,我正在创建一个非常像这样的对象:
connect() {
mVHTGlove = new vhtGlove(params);
}
一旦我即将关闭应用程序,我就称之为:
disconnect() {
if (mVHTGlove)
delete mVHTGlove;
}
此调用总是触发带有以下消息的断点:
Windows 在 DesignerDynD.exe。
这可能是由于 堆,表示存在错误 DesignerDynD.exe 或它的任何 DLL 已加载。
这也可能是由于用户 在 DesignerDynD.exe 时按 F12 有焦点。
输出窗口可能有更多 诊断信息。
我无法修改 vhtGlove 类来修复堆栈的损坏,因为它是一个仅以头文件、lib 文件和 dll 形式提供的外部库。
有什么方法可以干净利落地使用这个类吗?
**** 编辑 ::: 我试图将事情精简到最低限度,但是我得到了相同的结果...这里有整个代码。
#include "vhandtk/vhtCyberGlove.h"
#include "vhandtk/vhtIOConn.h"
#include "vhandtk/vhtBaseException.h"
using namespace std;
int main(int argc, char* argv[])
{
vhtCyberGlove* testGlove = NULL;
vhtIOConn gloveAddress("cyberglove", "localhost", "12345", "com1", "115200");
try
{
testGlove = new vhtCyberGlove(&gloveAddress,false);
if (testGlove->connect())
cout << "Glove connected successfully" << endl;
else
{
throw vhtBaseException("testGlove()->connect() returned false.");
}
if (testGlove->disconnect())
{
cout << "Glove disconnected successfully" << endl;
}
else
{
throw vhtBaseException("testGlove()->disconnect() returned false.");
}
}
catch (vhtBaseException *e)
{
cout << "Error with gloves: " << e << endl;
system("pause");
exit(0);
}
delete testGlove;
return 0;
}
删除手套后仍然崩溃。
EDIT #2 :: 如果我只是分配和删除 vhtCyberGlove 的一个实例,它也会崩溃。
int main(int argc, char* argv[])
{
vhtCyberGlove* testGlove = NULL;
vhtIOConn gloveAddress("cyberglove", "localhost", "12345", "com1", "115200");
testGlove = new vhtCyberGlove(&gloveAddress,false);
delete testGlove; //<<crash!
return 0;
}
有什么想法吗?
谢谢!
JC
【问题讨论】:
-
请注意,您不需要检查 mVHTGlove 是否为 NULL。将 NULL 指针传递给 delete 是很好的定义。
-
disconnect() 调用了多少次?
-
如果一个简单的 new 和 delete 崩溃,那么您使用的库似乎有缺陷。或者,您的编译器创建的运行时环境与库所期望的环境之间可能存在一些不匹配。我在这里有点含糊,但我看到由于未正确链接而出现奇怪的错误。
-
感谢您的接受,但为什么呢?我很好奇这是怎么做到的。
-
啊.. 好吧,我刚刚注意到我没有接受这个问题的任何答案,而且你的答案对于给定的信息来说已经足够完整了!该库要么自己处理指针(看到我使用 new 运算符创建对象会很奇怪),要么它们破坏了堆栈。这对我的应用程序来说并不重要,我现在还有很多其他的工作要做:)另外,在接下来的几个月里应该随时都有新版本的 API!
标签: c++ heap-memory heap-corruption fault-tolerant-heap