对于特定资源,如文件句柄、数据库连接等,使用自定义删除器可以确保资源的正确释放和管理。 通过使用自定义删除器,std::unique_ptr能够在释放资源时执行特定的清理操作,从而帮助节省内存并提升性能 voidcustomDeleter(int*ptr) {//自定义删除逻辑deleteptr; } std::unique_ptr<int, decltype(&customDeleter)> ptr(ne...
unique_ptr<string> p3(std::move(p1)); // 合法, std::move()将左值改变成右值 p1 = std::move(p2); // 使用move把左值转成右值就可以赋值了,效果和auto_ptr赋值一样 简单代码例子: #include <iostream>#include<string>#include<memory>#include<stdio.h>#include<stdlib.h>#include<vector>usingnam...
{//1. unique_ptr的初始化//1.1 通过裸指针创建unique_ptr(由于unique_ptr的构造函数是explicit的,必须使用直接初始化,不能做隐式类型转换)std::unique_ptr<Widget> ptr1(newWidget);//ok; 直接初始化//std::unique_ptr<Widget> ptr1 = new Widget();//error。不能隐式将Widget*转换为unqiue_ptr<Widget...
unique_ptr的创建可以使用两种方式:使用make_unique函数或使用new关键字构造。 2.1使用make_unique函数创建unique_ptr make_unique是C++14引入的一个函数模板,定义在<memory>头文件中。它可以直接创建一个指定类型的unique_ptr对象,并返回一个指向该对象的智能指针。示例如下: ...
需要谨慎处理的情况就是,如果由于使用场景可能会引起循环依赖,则需要weak_ptr. 如参考资料2中的Person类的两个对象都有一个shared_ptr指向对方,作为自己的伙伴。或者每个学生的选课列表中有多门课程,而每门课程的学生名单中又包括多个学生的列表,如果列表的元素是shared_ptr,则会产生循环依赖,导致析构时的指针悬挂。
// 避免直接使用new - 反例:直接使用new而不通过std::make_unique std::unique_ptr<int> ptr(new int(42)); // 不推荐 // 解释:尽管这样可以工作,但推荐使用std::make_unique,它提供更好的异常安全性和代码清晰度。 // 资源管理 - 反例:多个unique_ptr指向同一资源 int* rawPtr = new int(42); ...
unique_ptr虽然没有支持普通的拷贝和赋值操作,但却提供了一种移动机制来将指针的所有权从一个unique_ptr转移给另一个unique_ptr。如果需要转移所有权,可以使用std::move()函数。 示例: int main() { unique_ptr<int> pInt(new int(5)); unique_ptr<int> pInt2 = std::move(pInt); // 转移所有权 ...
unique_ptr的使用方法很简单,首先需要包含头文件<memory>,然后使用std::unique_ptr<T>来定义一个unique_ptr对象,其中T是指向的类型。例如,可以定义一个指向int类型的unique_ptr对象如下: std::unique_ptr<int> ptr(new int); 这个语句中,new int会返回一个指向int类型的动态分配内存的指针,并将它传递给unique_...
unique_ptr可以与标准库容器(如vector、map等)无缝配合使用。在容器中存储unique_ptr指针,可以确保容器在销毁时自动释放所有资源。这在需要管理容器中动态分配的对象的场景下非常方便,避免了手动释放内存的麻烦。 4. 自定义删除器: unique_ptr允许我们自定义删除器(deleter),用于在资源不再需要时执行特定的释放操作。