2010-12-13 4 views
3

그래서 나는 GCC 4.5를 사용하여 반쯤 괜찮은 C++ 0x 코드를 사용하려고 시도하는 코드를 해킹했다.인터페이스를 반환하는 shared_ptr

shared_ptr<IEngineLayer*> createEngineLayer(void) 
{ 
    try 
    { 
     CEngineLayer* engine = new CEngineLayer; 
     IEngineLayer* interface = dynamic_cast<IEngineLayer*>(engine); 

     return shared_ptr<IEngineLayer*>(interface); 
    } 
    catch(std::bad_alloc&) 
    { 
     // Unable to allocate enough memory for the engine layer. 
     return shared_ptr<IEngineLayer*>(); 
    } 
} 

그리고 나는 이것을 얻는다.

shared_ptr_base.h:545:65: error: cannot convert ‘DEngine::IEngineLayer*’ to ‘DEngine::IEngineLayer**’ in initialization

이 문제를 어떻게 해결할 수 있습니까?

(또한 사이드 노트로서 shared_ptr은 아무도 더 이상 사용하지 않을 때 인터페이스와 CEngineLayer를 모두 삭제합니까?)

답변

4

shared_ptr<T> 모델 T에 대한 포인터하는 shared_ptr<T *> 모델 포인터를 T에 포인터. CEngineLayerIEngineLayer에서 공개적으로 상속하는 경우를 : 또한 '기지로 파생 된'변환이 명시 적 캐스트를 필요로하지 않습니다

shared_ptr<IEngineLayer> createEngineLayer() 
{ 
    try 
    { 
     return shared_ptr<IEngineLayer>(new CEngineLayer); 
    } 
    catch(const std::bad_alloc&) 
    { 
     // Unable to allocate enough memory for the engine layer. 
     return shared_ptr<IEngineLayer>(); 
    } 
} 

:

CEngineLayer 당신이 당신의 코드를 변경할 수하는 IEngineLayer이라고 가정 CEngineLayer에 대한 포인터는 암시 적으로 IEngineLayer에 대한 포인터로 변환 될 수 있습니다.

Also, as a side note, will shared_ptr destroy both the interface and the CEngineLayer when nobody is using it anymore?

유형이 CEngineLayer 단일 개체가 어떤 IEngineLayer의 소멸자 (그리고 있어야) 가상 경우, 정확하게 기준 카운트가 0

+0

감사를 삭제, 내가 좀 벡터 같은 다른 STD 컨테이너의 라인을 따라 다음보다는 포인터 기억 해요. 그 단일 개체 정보를 가져 주셔서 감사합니다. – Jookia

2

돌아갑니다.

는 캐스트가 하나 필요하지 않습니다 :

shared_ptr<IEngineLayer> createEngineLayer() 
{ 
    try 
    { 
     CEngineLayer* engine = new CEngineLayer; 

     return shared_ptr<IEngineLayer>(engine); 
    } 
    catch(std::bad_alloc&) 
    { 
     // Unable to allocate enough memory for the engine layer. 
     return shared_ptr<IEngineLayer>(); 
    } 
} 
0

또한 수에 도달 할 때 파괴 될

: 또한
std::shared_ptr<IEngineLayer> createEngineLayer(void) 
{ 
    return std::make_shared<CEngineLayer>(); 
} 

다음 코드는 메모리 누수를 생성한다는 것이다 : 나은 성능의 관점에서, 이는 make_shared 사용하십시오
std::shared_ptr<IEngineLayer> createEngineLayer(void) 
{ 
    IEngineLayer* pInterface = new CEngineLayer; 

    return std::shared_ptr<IEngineLayer>(pInterface); 
} 

이 경우에는 shared_ptr의이 IEngineLayer하지 CEngineLayer