构造函数unique_ptr( pointer p )标记为explicit,这将防止在数组列表初始化中隐式构造unique_ptr实例。
它们都不支持所需的行为(请注意,第三个函数被标记为delete)。
自定义 make_unique_array 函数: 这个函数模板接受一个数组大小和类型作为参数,并返回一个指向该类型数组的 std::unique_ptr。 使用new T[size]() 动态分配数组,并初始化为默认值(对于内置类型如 char,默认值为 0)。 在main 函数中使用 make_unique_array: 创建一个大小为 10 的字符数组。 使用循环初始化...
第一个重载用于单个对象,第二个重载为数组调用,第三个重载防止您指定类型参数的数组大小((make_unique<T[N]>);目前的标准不支持这种结构。 当使用make_unique创建unique_ptr到数组时,您必须单独初始化数组元素。 如果您正在考虑此重载,也许使用std::vector是更好的选择。
unique_ptr<T>(new T(std::forward<Args>(args)...)) 2) 构造未知边界的 T 数组。此重载仅若 T 是未知边界数组才参与重载决议。函数等价于: unique_ptr<T>(new typename std::remove_extent<T>::type[size]()) 3,6) 不允许构造已知边界的数组。 4) 同(1) ,除了默认初始化对象。此重载仅若 ...
正如你看到的,make_unique完美传递了参数给对象的构造函数,从一个原始指针构造出一个std::unique_ptr,返回创建的std::unique_ptr。这个形式的函数不支持数组和定制删除器(见条款18),但它证明了一点点的努力就可以根据需要创建一个make_unique。要记住的是不要把你的版本放到std命名空间里,因为你不想当升级到c++...
正如你所看到的,make_unique只是将其参数完美转发给正在创建的对象的构造函数,然后利用new生成的原始指针构造std::unique_ptr,并返回创建的std::unique_ptr。这种形式的函数不支持数组或自定义删除器(参见Item 18),基于这个示范,只需增加一些功能就能写出你想要的make_unique函数。但是要记住不要将这样的函数放在std...
对于std::unique_ptr来说,其make函数就只在这两种场景(定制删除器和大括号初始化器)有问题。对于std::shared_pr来说,其make函数的问题会更多一些。这两种都是边缘情况,但是一些开发者就喜欢处理边缘情况,你也许也是其中之一。 一些类会定义自己的opeator new和operator delete。这表示全局的内存分配和释放函数对该...
同时,make_unique也遵循了RAII(资源获取即初始化)原则,可以确保在对象离开作用域时会自动释放分配的内存。 示例代码: ```cpp #include int main() { // 使用make_unique创建一个int类型的对象 auto ptr = std::make_unique(42); // 使用make_unique创建一个数组类型的对象 auto arr = std::make_unique...
std::make_unique 和 std::make_shared是三个make函数中的两个,make函数用来把一个任意参数的集合完美转移给一个构造函数从而生成动态分配内存的对象,并返回一个指向那个对象的灵巧指针。第三个make是std::allocate_shared。它像std::make_shared一样,除了第一个参数是一个分配器对象,用来进行动态内存分配。