2009-08-06 5 views
3

Windows DLL 동적 라이브러리를 생성 할 때 일부 함수를 DLL에 전용으로두고 다른 응용 프로그램에서 액세스 할 수 없도록 내보낼 함수를 선언해야합니다.Windows DLL 라이브러리에서 소멸자를 내 보내야합니까?

소멸자를 내보낼 필요가 있는지 또는 컴파일러 또는 Windows 커널에서 자동으로 처리해야하는지에 관해 언급 한 내용을 본적이 없습니까? 내가 소멸자를 내 보내지 않았고 동적으로 선언 할 수있는 클래스를 할당하는 경우, 소멸자가 반출되지 않으면 성공적으로 삭제를 호출 할 수 있습니까?

답변

6

일반적으로 생성자가있는 클래스는 소멸자를 내 보내야합니다.

말했다되는 것을

Windows에서 구축하는 경우, 당신은 라이브러리와 VS 버전을 혼합주의 할 필요가 ... 몇 가지 여기서주의해야 할이 있습니다. 라이브러리 만 DLL로 배포하려는 경우에는 생성자 및 소멸자를 내보내는 것이 좋지 않습니다. 문제는 C++ 런타임에 있습니다. 메모리 할당을 처리하는 동일한 런타임에서 할당 해제를 처리해야한다는 요구 사항이 있습니다. 이것은 VS 2008 내에서 VS 2005에서 컴파일 된 라이브러리를 사용하려고 할 때 발생하는 "나쁜 것"의 # 1 원인입니다.

이 해결책은 클래스를 생성하기위한 팩토리 메소드를 제공하는 것입니다 (할당은 컴파일 한 런타임에 의해 처리됩니다). 클래스를 삭제/소멸시키는 메소드 (즉, 같은 런타임에서 할당 해제가 발생합니다).

+2

공장 기능 경로를 사용하면 C++이 아닌 프로그램에서 DLL을 사용할 가능성이 생깁니다. 모든 사람이 좋은 것으로 생각하기를 바랍니다. –

+0

좋아, 일반적으로 소멸자를 내보내는 것은 나쁜 일이 될 수 있습니다. 저는 실제로 팩터 방법을 사용하여 생성을 계획하고 있었기 때문에 앞으로 진행할 수 있습니다. 또한 명확성을 위해 같은 런타임이 할당을 해제하고 할당하는 것이 왜 그렇게 나쁜지에 대해 좀 더 설명 할 수 있습니까? –

+0

@IQ : VC2005 런타임이 VC2008의 런타임에 의해 할당 된 것을 삭제하면 메모리 손상, 충돌 등의 원인이되는 버그를 가끔씩 발견 할 수 있습니다. –

4

소멸자를 사용할 수 없지만 반드시 있어야하는 경우 컴파일러에서 오류를 생성해야합니다. 일반적으로 생성자를 내 보내면 소멸자도 있어야합니다.

관련 문제