相关疑难解决方法(0)

C++中make_shared和普通shared_ptr的区别

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));
Run Code Online (Sandbox Code Playgroud)

许多google和stackoverflow帖子就在这里,但我无法理解为什么make_shared比直接使用更有效shared_ptr.

有人可以一步一步解释我创建的对象序列和两者所做的操作,这样我就能理解make_shared效率如何.我在上面给出了一个例子供参考.

c++ shared-ptr c++11

252
推荐指数
5
解决办法
9万
查看次数

是使用shared_ptr.reset还是operator =?

我试图围绕C++ 11的新习语.

似乎至少使用shared_ptr,使用new T()和之间存在实质性差异make_shared<T>().

但是重置共享指针以指向某个新实例的方法呢.以前,我通常会使用reset(new T())会员.但是,这不是因为没有首先使用make_shared()的问题吗?(即它不允许make_shared分配对象,因此它被强制将ref计数放在单独的分配中而不是与T本身相同的分配中?)

是否更好地继续使用:

   mysharedptr = make_shared<T>(args...);
Run Code Online (Sandbox Code Playgroud)

或者,还有更好的方法?

并且不应该像make_shared那样重置提供参数的变量转发,这样就可以编写mysharedptr.reset(args ...);?

c++ shared-ptr c++11

34
推荐指数
2
解决办法
1万
查看次数

私有构造函数和 make_shared

我有一个带有私有构造函数的单例类。在静态工厂方法中,我执行以下操作:

shared_ptr<MyClass> MyClass::GetInstance()
{
    static once_flag onceFlag;

    call_once(onceFlag, []() {
        if (_instance == nullptr)
            _instance.reset(new MyClass());
    });

    return _instance;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用

_instance = make_shared<MyClass>();
Run Code Online (Sandbox Code Playgroud)

该代码无法编译。我的问题是:为什么new可以调用私有构造函数却make_shared不能?

c++ shared-ptr

5
推荐指数
1
解决办法
1万
查看次数

为什么shared_ptr&lt;int&gt; p; p=nullptr;编译?

由于 的构造函数std::shared_ptr被标记为显式构造函数,因此 like 的表达式auto p = std::make_shared<int>(1); p = new int(6);是错误的。

我的问题是为什么std::make_shared<int>(1); p = nullptr;编译

这是前面提到的代码片段:

#include <memory>
#include <iostream>

int main()
{
    auto p = std::make_shared<int>(1);

    //p = new int(6);

    p = nullptr;

    if(!p)
    {
        std::cout << "not accessable any more" << std::endl;
    }

    p.reset();
}
Run Code Online (Sandbox Code Playgroud)

此类代码可在std::shared_ptr: reset() vs. assignment中看到

c++ explicit smart-pointers shared-ptr c++11

4
推荐指数
1
解决办法
274
查看次数

标签 统计

c++ ×4

shared-ptr ×4

c++11 ×3

explicit ×1

smart-pointers ×1