给代码示例总是有帮助。
堆损坏真的很棘手,因为即使它是错误的,它可能不会被检测到。所以虽然你可能会以某种方式持续发生崩溃,但这并不意味着当你没有崩溃时它不会崩溃。
由于静态初始化,崩溃而不能连接是合理的。我会尝试在连接DLL时手动初始化这些类型的资源。在DLL分离时删除资源,并将指针设置为零。有“主要”静态函数来处理这个,你可以进入。
您也可能会对静态的初始化顺序做出假设,但这并不是毫无保证的。更糟糕的是,他们会长时间表现相对一致,然后出于某种原因而看似随机的时间突然出现,这一点并不明显。
COM对象的另一种可能性是您的二进制兼容性不再匹配调用代码所期望的接口。如果您正在实现的界面不是PURE虚拟的,这可能是特别意外的。如果接口具有默认实现的任何方法,则需要覆盖它们。
struct foo_base {
virtual ~foo_base() {}
virtual std::string getName() const {
return "Willem Dafoe";
}
};
struct foo_derived : public foo_base {
virtual ~foo_derived() {}
};
即使这是完全有效的C++,它可能无法用作COM对象。
如果您对血腥细节不感兴趣,请为虚拟方法添加一个实现,该虚拟方法只需调用基础。
struct foo_base {
virtual ~foo_base() {}
virtual std::string getName() const {
return "Willem Dafoe";
}
};
struct foo_derived : public foo_base {
virtual ~foo_derived() {}
virtual std::string getName() const {
return foo_base::getName();
}
};
我从来没有见过从这个人的堆腐败消息,但我看到它调用垃圾指针的方法。如果您试图释放它,我可以看到可能被检测为堆损坏。
一些代码会很有用。一个简单的repro案例。 – Robinson 2012-03-13 18:58:45