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++ 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 ...);?
我有一个带有私有构造函数的单例类。在静态工厂方法中,我执行以下操作:
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不能?
由于 的构造函数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)