很抱歉,如果這個被問了,但我有一個很難尋找析構函數和訪問衝突=)基類虛析構函數訪問衝突
這裏的C++僞代碼的情景:
在DLL1 (編譯/ MT)
class A
{
public:
virtual ~A() <== if "virtual" is removed, everthing works OK
{
}
}
class B : public A
{
public:
__declspec(dllexport) ~B() // i did try without exporting the destructor as well
{
} <== Access Violation as it returns (if fails in assembly at delete operator...)
}
在DLL2可鏈接到DLL1
main()enter code here
{
B* b = new B();
delete b; <== Access Violation
}
這是怎麼回事?我有一個腦筋急轉彎嗎?如果我讓A的析構函數爲非虛擬的,那麼一切都可以正常工作 - 即使A和B的析構函數被調用(就好像A的析構函數是虛擬的 - 這是由於它是公共的事實嗎?)。
雖然我的主要問題是爲什麼當基類的析構函數被聲明爲虛擬時存在訪問衝突?
「你從一個堆中有效地分配一個DLL中的內存,並從另一個堆中刪除另一個DLL中的內存。「 我不認爲這是代碼的樣子。 – leiz 2009-12-03 04:19:10
雖然這不是代碼的樣子,但我認爲這就是發生了什麼。可能是析構函數是否是虛擬的,會影響析構函數是否被內聯到調用它的DLL中。 – ChrisW 2009-12-03 04:29:52
沒有在cpp中的析構函數而不是在頭中內聯也解決了這個問題? – 0xC0DEFACE 2009-12-03 04:37:08