11

是否可以编写一个智能指针,在其构造函数中分配对象本身 - 而不是开发人员必须调用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()))

...如果第二次分配发生并在第一个对象安全地嵌入其智能指针之前抛出,则可能会泄漏首先分配的任何对象。但是更智能的指针真的可以保证安全吗?

4

4 回答 4

17

make_shared(). 它这样做会分配一个新对象并从中创建一个shared_ptr

于 2012-07-27T13:44:09.493 回答
11

一般来说,这不能用智能指针的构造函数来完成。对于是否应该使用指针参数来初始化智能指针或转发以创建新对象,将会存在歧义。

可以使用工厂函数来完成,例如:

template <typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

如果您正在使用std::shared_ptr,那么您可以使用std::make_shared. 这也带来了只需要一个内存分配的优点,其中std::shared_ptr<T>(new T)对象需要一个,共享引用计数需要第二个。

于 2012-07-27T13:57:42.510 回答
2

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

因此,你需要另一个名字,那就是make_shared

于 2012-07-27T13:50:35.020 回答
2

这在 C++11 中是新的可能,它添加了完美的转发和可变参数模板。

于 2012-07-27T13:48:19.943 回答