2012-12-24 3 views
1

저는 최근에 모든 원시 포인터를 C++ 11 스마트 포인터로 바꾸는 과정을 밟았습니다. 이제는 내 DirectX 긴 포인터를 제외하고 마침내 끝났습니다.directx에 대한 C++ 스마트 포인터

std::shared_ptr<IDirect3D9> p_d3d; 
p_d3d(Direct3DCreate9(D3D_SDK_VERSION), [](IDirect3D9 *p) {//smart pointer initialization(1) 
     p->Release(); 
}); 

내가 비주얼 스튜디오에서 다음과 같은 오류 받고 있어요 :

오류 :

나는 아래의 구현의 라인을 따라 뭔가를 좀하고 싶습니다의 객체의 호출을 적절하지 않은 클래스 유형 operator() 또는 포인터 대 함수 유형 변환 함수

std :: un를 사용하는 것이 좋습니다. CComPtr보다 ique_ptr 또는 std :: shared_ptr. 왜 이런 일이 발생하고 가능한 구현 방법에 대한 아이디어가 있습니까?

+0

초기화는 변수를 선언 할 때 수행됩니다. – chris

+1

C++ 스마트 포인터는 COM 개체가 의존하는 참조 계산 의미를 지원하지 않습니다. COM 스마트 포인터를 사용하는 것이 좋습니다. 두 개의 경쟁 참조 계수 체계를 갖는 – IInspectable

+1

은 좋은 생각이 아닙니다. 특히 객체에 참조 된 의도 된 체계로 객체에 스마트 포인터가있는 동안 파괴 될 수 있습니다. 대신 자신 만의 COM 스마트 포인터를 만드십시오. Boost 라이브러리를 사용하고 있다면'boost :: intrusive_ptr'를 사용하여 일부 작업을 저장할 수 있습니다 (이름을 올바르게 기억한다면). 불행하게도이 빌딩 블록은 C++ 11 표준에 채택되지 않았습니다. –

답변

2

shared_ptr에서 operator()를 호출하는 것 같습니다. 그건 당신이 shared_ptr을 만드는 방법이 아닙니다. 리셋을 사용하거나 변수를 선언 할 때 같은 줄에 포인터를 구성 해보십시오.

호출하는 작성 기능이 참조 계수가 1 인 포인터를 제공하므로주의하십시오.

관련 문제