Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从原始指针返回智能指针_C++_C++11_C++14 - Fatal编程技术网

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);
}