給代碼示例總是有幫助。
堆損壞真的很棘手,因爲即使它是錯誤的,它可能不會被檢測到。所以雖然你可能會以某種方式持續發生崩潰,但這並不意味着當你沒有崩潰時它不會崩潰。
由於靜態初始化,崩潰而不能連接是合理的。我會嘗試在連接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