2012-02-06 116 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

我有一个内存管理器没有处理空指针的问题。