C++ 从原始指针返回智能指针
这就是我从原始指针返回智能指针的方式C++ 从原始指针返回智能指针,c++,c++11,c++14,C++,C++11,C++14,这就是我从原始指针返回智能指针的方式 std::shared_ptr<Geometry> Clone() const { Circle *sc = new Circle(*this); return std::shared_ptr< Geometry >(sc); } std::shared_ptr Clone()常量 { 圆圈*sc=新圆圈(*此); 返回std::shared_ptr(sc); } 从原始指针返回智能指针是否正确?正确的方法是返回以
std::shared_ptr<Geometry> Clone() const
{
Circle *sc = new Circle(*this);
return std::shared_ptr< Geometry >(sc);
}
std::shared_ptr Clone()常量
{
圆圈*sc=新圆圈(*此);
返回std::shared_ptr(sc);
}
从原始指针返回智能指针是否正确?正确的方法是返回以下内容
return std::make_shared<Geometry>(new Circle(*this));
但是通过使用make_shared,它在内存中看起来是这样的
+--+ +---------+-------------+--------------
|sp| ---> | Circle | strong refs | weak refs ...
+--+ +---------+-------------+--------------
这更有效。术语“正确”相当模糊。好的,如果你要求的话,这个代码应该可以工作。但是,您应该考虑更多的细节
首先,最好在构造智能指针的同一表达式中构造对象:
std::shared_ptr<Geometry> Clone() const
{
return std::shared_ptr< Geometry >(new Circle(*this));
}
在这种情况下,只为对象和计数器结构分配一次内存。除非您使用std::weak\u ptr
,否则效果会更好。使用std::make_shared
和std:weak_ptr
:共享计数器的实际内存释放(在std::make_shared
的情况下,与对象本身使用的内存相同)将仅在最后一个weak_ptr被销毁后进行。这可能会导致某种内存泄漏
因此,您使用它的方式是正确的,但是没有足够的信息来判断什么是最好的惯用方式。这应该可以回答您的问题:正如我在下面所回答的,此解决方案可能有缺点。此答案是错误的。我建议你移除它,因为如果你修复了它,你只会重复@DmitryKuzminov的答案。@j6t哪种方式错了?执行共享任务的正确方法必须是
返回std::make_shared(*this)
。没有新的。也许你的意思是返回std::shared\u ptr(新圆圈(*this))
?但是@DmitryKuzminov.@t.niese已经提到了所有这些。试着回答这个问题:与直接使用std::shared\u ptr
构造函数相比,使用std::shared\u ptr
有什么好处?答案是:您可以为对象和控制结构分配一次内存。确保这些内存位置不重叠,但它们位于同一内存块中。在我的回答中,我添加了更多关于weak\u ptr
和make\u shared
用法的信息。@t.niese,这个问题只有在这种情况下才会出现。但这个问题略有不同。如果第一个shared\u ptr
是使用构造函数创建的,该构造函数将原始指针传递给已经创建的对象,那么您可能会为控制结构滥用一些内存(几个字节)。但是在make_shared
的情况下,这不是“几个字节”,而是对象的大小,这可能是一个巨大的内存损失。好的,现在我明白你所指的了。我删除了我的评论。
+--+ +---------+-------------+--------------
|sp| ---> | Circle | strong refs | weak refs ...
+--+ +---------+-------------+--------------
std::shared_ptr<Geometry> Clone() const
{
return std::shared_ptr< Geometry >(new Circle(*this));
}
std::shared_ptr<Geometry> Clone() const
{
return std::make_shared< Circle >(*this);
}