2010-12-13 57 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>(); 
    } 
} 

還要注意,「導出到基地」轉換並不需要顯式轉換:如果CEngineLayerIEngineLayer公開繼承,一個指向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 2010-12-13 10:57:00

2

返回shared_ptr<IEngineLayer>代替。

不需要演員之一:

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

你也可以使用make_shared,這是從性能角度更好:

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

而且是是下面的代碼創建內存泄漏:

std::shared_ptr<IEngineLayer> createEngineLayer(void) 
{ 
    IEngineLayer* pInterface = new CEngineLayer; 

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

在這種情況下的shared_ptr刪除一個IEngineLayer和不CEngineLayer