C++语言基础篇一

1、四种智能指针

        智能指针是用于管理一个指针,避免因为申请的空间在函数结束后忘记释放,从而造成内存泄露的情况。        

        智能指针本质上就是一个类,当超出了类的作用域时,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。

1、常用接口
T* get();
T& operator*();
T* operator->();
T* operator=(const T& val);
T* release;
void reset (T* ptr = nullptr);
  • T是模板参数,也就是传入的类型;
  • get()用来获取auto_ptr封装在内部的指针,也就是获取原生指针;
  • operator()*重载*,operator->()重载->,operator=()重载了=;
  • release()将auto_ptr封装在内部的指针置为nullptr,但并不会破坏指针所指向的内容,函数返回的是内部指针置空之前的值;
  • reset()直接释放封装的内部指针所指向的内存,如果指定了ptr的值,则将内部指针初始化为该值(否则将其设置为nullptr)
2、auto_ptr(c++98的方案,C11已经抛弃,采用所有权模式)
auto_ptr<std::string> p1 (new string ("hello"));
auto_ptr<std::string> p2;
p2 = p1; //auto_ptr 不会报错.

        此时不会报错,p2剥夺了p1的所有权,但是当程序运行时访问p1时将会报错。所以auto_ptr的缺点是:存在潜在的内存崩溃问题!

3、unique_ptr(替换auto_ptr)

unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只能有一个智能指针可以指向对象。它对于避免资源泄露特别有用。

auto_ptr<std::string> p1 (new string ("hello"));
auto_ptr<std::string> p2;
p2 = p1; //auto_ptr 此时会报错.

编译器认为p2 = p1非法,避免了p3不再只想有效数据的问题。因此unique_ptr比auto_ptr更安全。

4、shared_ptr(共享型,强引用)

        shared_ptr实现共享式拥有概念,多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时释放。它使用计数机制来表明资源被几个指针共享。

可以通过成员函数use_count()来查看资源的拥有者个数,出来可以通过new来构造,还可以通过传入auto_ptr,unique_ptr,weak_ptr来构造。当使用release()时,当前指针会释放资源所有权,计数减一。当计数等于0时,资源会被释放。

shared_ptr是为了解决auto_ptr在对象所有权上的局限性(auto_ptr是独占的),在使用引用计数的机制上提供了可以共享所有权的智能指针。

5、weak_ptr(弱引用)

        weak_ptr是一种不控制对象生命周期的智能指针,它指向一个shared_ptr管理的对象。进行该对象的内存管理的是那个强引用的shared_ptr。weak_ptr只是提供了对管理对象的一个访问手段。weak_ptr设计的目的是配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它只可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起引用计数的增加或减少。

        weak_ptr是用来解决shared_ptr相互引用时的死锁问题。它和shared_ptr可以相互转换,shared_ptr可以直接赋值给他,它可以通过调用lock函数来获得shared_ptr。

2、C++中内存分配情况

栈:由编译器管理分配和回收,存放局部变量和函数参数。

堆:由程序员管理,需要手动new malloc delete free进行分配和回收,空间较大,但可能会出现内存泄漏和空闲碎片的情况。

全局/静态存储区:分为初始化和未初始化两个相邻区域,存储初始化和未初始化的全局变量和静态变量。

常量存储区:存储常量,一般不允许修改。

代码区:存放程序的二进制代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值