2012-01-27 5 views
0

문자열과 같은 특정 해시에 대한 COM 개체의 맵을 만들려고합니다. 이것은 구현중인 캐싱 알고리즘입니다. 아이디어는 이전 코드 줄에서 이미 열려있는 파일을로드하려고하면 이미 만든 메모리 블록을 IStream 형식으로 반환하고 파일을 메모리로 다시로드하지 않아도됩니다. 내가 겪었던 한 가지 문제는 마지막 참조가 삭제 될 때 자동으로 COM 객체가 파괴되는 것입니다. 원래 컨테이너는 해당 개체가 손상되었음을 인식하지 못하고 해제 된 개체에 액세스 할 때 파일을로드하는 대신 잘못된 메모리 핸들을 반환합니다. 이것을 구현하는 더 좋은 방법이 있습니까, 아니면 STL을 포기하고 대신 자신의 컨테이너를 만들어야합니까?COM 개체에서 std :: map을 사용 하시겠습니까?

+2

지도에서 COM 개체에 대한 스마트 포인터를 사용하십시오. 이렇게하면 더 이상 필요하지 않게 될 때까지 참조를 보유하여 조기에 삭제되지 않도록합니다. –

답변

1

컨테이너에 인터페이스 포인터를 넣은 코드가 AddRef()를 호출하는 것을 잊어 버린 버그입니다. 안 함 참조 수를 늘리지 않고도 COM 인터페이스에 대한 포인터를 저장합니다.

+1

컨테이너가 AddRef를 호출하는 것을 잊지 않았으므로 처음에는 그렇게하지 않았습니다. AddRef를 컨테이너에 추가하기 전에 직접 호출하거나 스마트 포인터를 사용하십시오. Microsoft는 유용하게 2를 선택하여 제공합니다. –

+0

COM 개체를 포함 할 수있는 컨테이너에 대한 자체 알고리즘을 작성하게되었습니다. 코드베이스의 대부분을 다시 작성하는 것보다 간단 해 보였습니다. – Alex

관련 문제