2012-02-06 3 views
0

기본 exe는 dll을로드합니다. 간단한 boost :: any를 반환하는 dll 함수를 호출합니다. boost :: any가 소멸자에서 FreeLibrary 앱이 충돌 한 후 삭제 된 경우. 괜찮아. 하지만 난 왜이 코드도 r2 소멸자에서 충돌, 메인에서 만든 r2 및 삭제 dll 코드가 필요없는 이해할 수 없다. FreeLibrary 후에 boost :: any를 어떻게 저장할 수 있습니까? extern "C"없이 시도 - 동일한 효과.boost :: any destructor crash

콘솔 코드 :

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; 
    } 
} 

컴파일러 비주얼 스튜디오 2005

+1

호출 규칙이 일치합니까? 동적으로로드 된 함수를 통해 포인터보다 복잡한 것은 전달하지 않습니다. – PlasmaHH

+0

PlasmaHH를 사용하고 있습니다. 동적 링크는 C++ ABI, 템플릿 코드, 예외 등과 잘 매치되지 않습니다. – sehe

+0

해결책을 찾지 못했습니다. boost :: any를 복사하면 dll 내부에서 실행되는 가상 메소드 clone()이 호출되므로 새 객체의 가상 테이블도 dll에 있습니다. – micdelt

답변

1

이 실제로 any이 무엇인지에 따라 달라집니다. 예를 들어 소멸자가있는 객체에 대해 shared_ptr 일 수 있지만 소멸자 코드는 DLL에 있습니다. 그런 다음 DLL 언로드 전에 any의 모든 인스턴스를 파괴해야합니다.

0

null 포인터를 처리하지 않는 메모리 관리자에서 동일한 문제가 발생했습니다.