所以我正在破坏我的代码,尝试使用GCC 4.5将其转换为一些不太合适的C ++ 0x代码。
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:错误:初始化时无法将'DEngine :: IEngineLayer *'转换为'DEngine :: IEngineLayer **'
我该如何解决这个问题?
(另外,作为旁注,当没有人再使用它时,shared_ptr会破坏接口和CEngineLayer吗?)
答案 0 :(得分:4)
shared_ptr<T>
模拟指向T
的指针,shared_ptr<T *>
模拟指向T
指针的指针。
假设CEngineLayer
是IEngineLayer
,您可以将代码更改为:
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
。
另外,作为旁注,将是shared_ptr 破坏界面和界面 当没有人使用它时,CEngineLayer 了吗?
有一个类型为CEngineLayer
的对象,如果IEngineLayer
中的析构函数是虚拟的(它应该是),则当引用计数达到0时将被正确销毁。
答案 1 :(得分: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>();
}
}
答案 2 :(得分: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