2012-02-06 47 views
0

主要exe加載dll。從dll調用函數返回簡單的boost :: any。如果boost ::任何在FreeLibrary應用程序在析構函數崩潰後被刪除。沒關係。但我不明白爲什麼這個代碼也會在r2析構函數中崩潰,在main和delete中創建的r2不需要dll代碼。 如何在FreeLibrary之後保存boost :: any。 嘗試無外部「C」 - 相同的效果。boost ::任何析構函數崩潰

控制檯代碼:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    any r2; 

    HMODULE hmod = LoadLibrary(L"dll"); 
    typedef any (*dllfunc)(int,int,int); 
    dllfunc func = (dllfunc) GetProcAddress(hmod,"Export1"); 

    { 
    any r = func(1,2,3); 
    r2 = r; 
    } 

    FreeLibrary(hmod); 
    return 0; 
} 

DLL的代碼:

extern "C" 
{ 
    DLL_API any Export1(int a,int b, int c) 
    { 
    return a+b+c; 
    } 
} 

編譯器的Visual Studio 2005

+1

您確定調用約定匹配嗎?我絕不會通過任何比通過動態加載函數的指針更復雜的東西... – PlasmaHH 2012-02-06 13:05:12

+0

我與PlasmaHH。動態鏈接與C++ ABI,模板代碼,異常等無法很好地匹配。 – sehe 2012-02-06 13:07:26

+0

找到了答案,但沒有解決方案。當你複製boost :: any時,它會調用在dll中執行的虛方法clone(),所以新對象的虛表也駐留在dll中。 – micdelt 2012-02-06 13:13:08

回答

1

這取決於實際any是什麼。例如,它可能是一個shared_ptr與析構函數,而析構函數代碼駐留在DLL中。然後在卸載DLL之前應該銷燬所有any的實例。

0

我有一個內存管理器沒有處理空指針的問題。