为什么智能指针不能在构造函数中为我调用new()?

时间:2012-07-27 13:42:18

标签: c++ memory-management smart-pointers

是否可以编写一个智能指针,在其构造函数中分配对象本身 - 而不是开发人员必须调用new?换句话说,而不是写:

std::unique_ptr<myClass> my_ptr(new myClass(arg1, arg2))

......有人可以写:

std::smarter_ptr<myClass> my_ptr(arg1, arg2)

语言语法能表达吗?这会是可取的吗?可怕?我正在考虑防止这个错误(我当然是自己做的):

myFunction(std::unique_ptr<myClass>(new myClass()), std::unique_ptr<myClass>(new myClass()))

...如果第二次分配发生并且在第一个对象安全地隐藏在其智能指针之前抛出,则会泄漏任何首先分配的对象。但是更智能的指针实际上会让这个安全吗?

3 个答案:

答案 0 :(得分:17)

查看make_shared()的实现。它这样做会分配一个新对象并从中创建一个shared_ptr

答案 1 :(得分:2)

C ++ 11新增了perfect forwarding和可变参数模板。

答案 2 :(得分:2)

基本上同样的问题需要std::findstd::find_if。您无法将此ctor与shared_ptr案例中new myClass(arg1)的现有ctors区分开来。参数的数量相等,arg1可以有任何类型。

因此,您需要另一个名称,即make_shared