关于智能指针说法错误的是,智能指针线程安全
终极管理员 知识笔记 86阅读
1. 起源
指针声明而未初始化,此时指针的将会随机指向 内存已经被释放、但是指针仍然指向它。这时内存有可能被系统重新分配给程序使用,从而会导致无法估计的错误
c 把内存的控制权对开发人员开放,让程序显式的控制内存,这样能够快速的定位到占用的内存,完成释放的工作。但是这样也会引发一些问题,也就是普通指针的隐患:
1.1 野指针出现野指针的有几个地方 :

// 野指针 int * p ; cout << "p : " << p << endl; int * p2 = new int(20); delete p2; cout << "p2 : " << p2 << endl;
1.2 重复释放 释放已经释放过的内存,或者释放已经被重新分配过的内存,就会导致重复释放错误.
//2. 重复释放 int * p3 = new int(30); delete p3; delete p3; //重复delete 会报错。 cout << "p3 : " << p3 << endl;
1.3 内存泄漏 不再使用的内存,并没有释放,或者忘记释放,导致内存没有得到回收利用。 忘记调用delete

//3. 忘记释放了 int * p4 = new int(40);
2. 简介 C 智能指针是一种特殊类型的指针,其作用是管理动态分配的内存资源,以提供更安全和方便的内存管理。智能指针通过封装原始指针,并在适当的时候自动释放内存,从而避免内存泄漏和悬挂指针等问题。
c 11标准用 unique_ptr
| shared_ptr
| weak_ptr
等指针来自动回收堆中分配的内存。智能指针的用法和原始指针用法一样,只是它多了些释放回收的机制罢了。
智能指针位于memory
头文件中,所以要想使用智能指针,还需要导入这个头文件 #include<memory>
int * p = new int(10);unique_ptr<int> up(p);
智能指针其实是一个类 , 它里面能够包装原始指针。
template <typename _Tp, typename _Dp = default_delete<_Tp> >class unique_ptr{ }
完整代码:
#include <iostream>#include<memory>using namespace std;class Abstract{ public: Abstract(){ cout <<"Abstract构造" <<endl; } ~Abstract(){ cout <<"Abstract析构" <<endl; }};void Construct_pointer(){ Abstract * A = new Abstract; unique_ptr<Abstract> up0 (A);}int main() { cout <<"----------------------" <<endl; Construct_pointer(); cout <<"----------------------" <<endl; return 0;}
unique_ptr 的析构:
~unique_ptr() noexcept { auto& __ptr = std::get<0>(_M_t);if (__ptr != nullptr) get_deleter()(__ptr);__ptr = pointer(); }
总结: 使用智能指针的类在栈内存创建的对象,来包装原始指针。 当智能指针的对象销毁了之后, 顺便也会销毁原始指针。 智能指针并不是指针,只是包装了指针的类而已。 unique_ptr<Abstract> *up = new unique_ptr<Abstract>(A);delete up; //报错
使用智能指针的类在堆内存创建的对象,来包装原始指针,会报错。
3. 智能指针智能指针把裸指针包装起来,在构造函数里初始化,在析构函数里释放。这样当对象失效销毁时,C 就会自动调用析构函数,完成内存释放、资源回收等清理工作。它实践了 RAII(Resource Acquisition Is Initialization),包装了裸指针,而且因为重载了 *
和 ->
操作符,用起来和原始指针一模一样。
unique_ptr
是一个独享所有权的智能指针,它提供了严格意义上的所有权。也就是只有这个指针能够访问这片空间,不允许拷贝&
标签: