【发布时间】:2014-07-28 08:58:12
【问题描述】:
我明白了:
shared_ptr<X> x = make_shared<X>();
比以下更有效:
shared_ptr<X> x(new X());
我了解这些优势。但是,我不明白为什么编译器不能有这样的规则
"如果我看到
new()与shared_ptr声明在同一行,请使用make_shared"
那么是什么阻止了编译器自动使用make_shared 并要求我们指定它?
【问题讨论】:
-
这不是关于效率,而是关于异常安全。
-
make_shared的效率提升来自于在一个地方分配对象和引用计数,因此调用make_shared可以导致不同的大小分配。有人可能有一个自定义的operator new,如果没有调用它(使用正确的size操作数),代码的可观察行为将会改变。 -
所以你希望标准只为一种类型在核心语言中创建一个特殊情况(这可能需要相当多的工作才能正确指定),所有这些都是为了让你免于输入几个字符?
-
@Mankarse 另外,我可以为我自己的一种类型编写
std::make_shared的特化,它做了完全不同的事情。 (这不是好的编码习惯,但它是合法的 C++。) -
make_shared可能有一个缺点 - 只要有指向它的弱指针,即使不再有任何共享指针,对象的内存也不会被释放。因此,当程序员没有指定它时,自动使用它可能会对内存使用产生负面影响,即使“好像”规则确实适用。
标签: c++ memory-management shared-ptr smart-pointers make-shared