自动释放:当unique_ptr生命周期结束时,自动调用delete释放资源,避免内存泄漏。 使用方法 #include<memory>voiduniquePtrExample(){// 创建一个unique_ptrstd::unique_ptr<int>ptr(newint(10));// 访问指针std::cout<<"Value: "<<*ptr<<std::endl;// 转移所有权std::unique_ptr<int>ptr2=std::move(ptr...
Unique_ptr &operator=(Unique_ptr &&rhx)noexcept{this->reset(rhx.release());return*this; }T *release()noexcept{returnstd::exchange(ptr_,nullptr);//返回当前指针指向地址,并置当前指针为空}T *get()constnoexcept{returnptr_; }voidreset(T *ptr)noexcept{deletestd::exchange(ptr_, ptr);//释放当...
首先,需要定义一个自定义的删除器函数,用于释放C指针所指向的内存。删除器函数的原型应与unique_ptr的删除器要求相匹配,即接受一个指针参数并返回void。例如: 代码语言:txt 复制 void customDeleter(int* ptr) { // 释放C指针所指向的内存 delete ptr; } ...
如果收到与unique_ptr有关的错误 C2280,则几乎可以肯定是因为你尝试调用其复制构造函数(此函数是一个deleted函数)。 根据设计,不能复制unique_ptr。 使用移动构造函数来转移所有权。 C++ // C2280_move.cpp// compile with: cl /c C2280_move.cppclassbase{public: base(); ~base(); base(base&&);// ...
unique_ptr使用场景: 1.为动态申请的资源提供异常安全保证 传统情况,可能会因为异常而没有走到delete部分,如下: voidfunc() {int*p =newint(10);//maybe throw exceptionif(NULL !=p) {deletep; p=NULL; } } 使用unique_ptr,只要unique_ptr指针创建成功,析构函数就一定会被调用,如下: ...
int* arr = new int[10]; delete[] arr; // 释放整个数组空间 用于分配指定数据类型的数组所需的内存空间。释放数组时,需要使用 delete[] 运算符:使用智能指针 C++11 引入了智能指针,可以自动管理内存,避免内存泄漏。常见的智能指针有:unique_ptr:独占式拥有指针,保证只有一个智能指针指向对象。shared_...
使用move进行所有权转移,这种方式让开发者可以注意到该指针move后,原指针会置为nullptr,不会和auto_ptr一样,开发者可能是无感知的。 模型如下: 案例: c++ unique_ptr<int> ptr1(new int(10)); //unique_ptr<int> ptr2 = ptr1;error不能赋值 //unique_ptr<int> ptr2(ptr1); //error不能拷贝 unique...
5、delete与智能指针 为了避免忘记使用delete释放内存而导致内存泄漏,C++引入了智能指针(如std::shared_ptr和std::unique_ptr)来自动管理内存,智能指针内部会维护一个计数器,当引用计数为0时,会自动释放所管理的内存,我们无需手动调用delete。 ```c++
彻底解决C++里 delete 指针两次的办法很简单, 就是不用 new / delete。全部使用智能指针,unique ptr / shared ptr( 我们还有自研的local ptr, 等效于内部不使用atomic的shared ptr, 只用于单线程或者某个线程内部,性能略高于 shared ptr ), 可以完全彻底杜绝此类问题的发生。
1、如果你真的需要使用独有的资源(对象),使用shared_ptr而不是unique_ptr会使你的代码容易出现资源泄露和一些bug。 不易察觉的bug:有没有想过这种情况,如果有其他程序员无意间通过赋值给另一个共享指针而修改了你共享出来的资源/对象,而你却从没有预料到这种事情!