2010-12-13 55 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