[C++] DLL에서 메모리 할당, 외부에서 해제
저장소/VC++아... 네이버님과 구글신께 물어봤으면 금방 해결할거를
하루종일 삽질하고있었기에 정리한다.
좋은 프로그래밍 습관 중 하나는 '메모리는 가급적 할당한 곳에서 해제하자.' 라고 할 수 있다.
사실 이 습관만 제대로 지킨다면 수많은 메모리 문제에서 약간은 해방될 수 있다고 생각한다.
물론 경우에 따라 다르겠지만 가급적이면 그렇게 하는 것이 좋다는거다.
이번에 생긴 문제는 제목 그대로 DLL에서 할당한 메모리는 외부에서 해제할 때 발생하였다.
(앞, 뒤 자르고 결론부터 말하자면 프로젝트 속성 중 '런타임 라이브러리'를 '다중 스레드 DLL'로
변경하니 잘 된다는거..;;;)
export한 DLL Function의 파라미터 중 하나를 STL list를 받게 구성하고 DLL 내부에서 문자열을 동적 할당한, list에 밀어넣고 외부에서 필요한 일을 한 후 delete할 때 문제 발생!!! 크아아아~
모르겠다 @_@
원인과 해결책은 이렇다고 한다.
DLL내부에서 STL객체를 생성하고 외부에서 STL객체를 사용 후 해제하려고 하면 access violation 발생한다. STL에서는 static data멤버를 사용한다. DLL내부(A라고 하자)에 STL객체를 생성하면 DLL내부에서는 static data 멤버를 사용하게 된다. DLL을 이용하는 외부DLL/EXE(B라고 하자)에서 DLL내부(A)에 생성한 STL객체를 포인터나 레퍼런스로 접근가능 하지만, 외부 DLL/EXE(B)에서 STL객체를 사용하면 외부 DLL/EXE(B)에 STL에서 사용하는 static data멤버가 DLL(A)와 독립적으로 생성이 되기 때문에 외부DLL/EXE(B)에서 메모리를 해제하려고 하면 sync가 맞지않아 access violation이 발생하게 되는 것이다.
위의 문제를 해결하는 방법은 아래와 같다.
1) STL에서 생성한 객체를 접근하는 method를 export한다.
2) 템플릿 클래스 인스턴스를 export하고 사용하는 곳(B)에서 import한다.
3) 위 방법보다 간단한 방법으로 VC++ .NET의 경우 프로젝트 셋팅에서 "다중 쓰레드 DLL(/MD, release 모드)"나 "다중 쓰레드 디버그 DLL(/MDd, debug모드)"로 모두(A, B) 설정해주면 된다.
[출처 : http://jglee.egloos.com/1015547] 맘대로 퍼와서 미안해요;;
위의 문제를 해결하는 방법은 아래와 같다.
1) STL에서 생성한 객체를 접근하는 method를 export한다.
2) 템플릿 클래스 인스턴스를 export하고 사용하는 곳(B)에서 import한다.
3) 위 방법보다 간단한 방법으로 VC++ .NET의 경우 프로젝트 셋팅에서 "다중 쓰레드 DLL(/MD, release 모드)"나 "다중 쓰레드 디버그 DLL(/MDd, debug모드)"로 모두(A, B) 설정해주면 된다.
[출처 : http://jglee.egloos.com/1015547] 맘대로 퍼와서 미안해요;;
MS에 이러한 내용이 있으니 참고~ (달달 외우는게 좋을까?)
[STL (표준 템플릿 라이브러리) 클래스와 STL 개체가 데이터 구성원을 포함하고 있는 클래스 인스턴스를 내보내는 방법]
http://support.microsoft.com/kb/168958/
[포인터 또는 다른 DLL 또는 EXE 참조를 통해 STL 개체에 액세스할 때 액세스 위반이 발생할 수 있습니다.]
http://support.microsoft.com/kb/q172396/
아무튼 삽질이여 안녕~
'저장소 > VC++' 카테고리의 다른 글
[Error/Warning] 빌드할 때 문제가 발생했다면 여기로! (0) | 2009.08.21 |
---|---|
[Error/Warning] warning LNK4098 (0) | 2009.08.21 |
[C++] CRT Debug Heap(Memory Leak 확인 방법) (0) | 2009.08.20 |
SQLite - 쿼리 실행 (0) | 2009.08.19 |
SQLite - 쿼리 실행(어떤거 써야해?) (0) | 2009.08.13 |