03__C++内存管理

(一)C++的内存管理
前言:提到内存管理,大概会想到:堆、栈、内存、溢出全局变量、局部变量、静态变量、智能指针、new、deletet、malloc、初始化、NULL等等。
还会想到一句话:记得释放不用的资源,避免资源泄露!

我认为:C/C++是操作十分丰富的语言,但只要长期规范使用,就OK了。

另外,需要对一些基本概念了然于胸,如:
(1)不同变量的内存分配位置,访问权限、生命周期;
(2)灵活运用语言,规范使用语言。

1.五大存储区
堆:一大段可分配的存储空间,由操作系统管理,可以用new等方式得到一块内存区使用。
栈:就是函数里定义的那些变量(特殊除外,比如一些静态、常量、堆、自由等)。
全局/静态:就是在函数体外或者使用static定义的变量,二者的作用域是不同的。
自由:malloc之类的吧,不过这一块其实可以划分到堆区。
常量:一些初始化的字符串、const定义的变量等等

2.XXX的生命周期
这点还能重要,比如栈中变量的生命周期很短暂,函数执行完会自动pop,那么这块资源又可以被重新利用类。
比如在函数中定义static的变量生命周期变的和全局变量一样。
比如new的XXX,要delete手动结果它。

以上说的都是程序运行时,在程序over的时候,OS肯定会保护自己可怜的内存,去释放。

3.new与delete
new是个好东西,可以为XXX拿到一块内存空间来使用,但是要记得不用的时候delete掉,把内存资源还给OS。
new可以这样用:
(1)给指针变量new一个类型的内存大小
    int *pint = new int;
    *pint = 10;
    delete pint;
(2)给指针变量new一个class的大小
    classname *a = new classname;
    delete a;
(3)给指针变量new一个数组
//一维
    int *a = new int[5];
    delete [] a;
//二维
    //5*3
    int **arr = nullptr;
    arr = new int *[5];
    for (int i = 0; i < 5; ++i) {
        arr[i] = new int[3];
    }
    //....opt arr
    for (int i = 0; i < 5; ++i) {
        delete [] arr[i];
    }
    delete [] arr;

4.堆栈大小限制
在五大存储区中,一般为们会比较关注堆栈是否溢出。
就栈来说,不要讲大内存变量在函数中定义,并且不要函数潜逃太深,尤其在嵌入式中,资源太少了,Linux下会来一些,大概有8-10M吧。
堆的大小是比栈大的多,但是也不要太浪费,记得手动释放,在析构函数中释放资源吧。
堆栈大小都是可以查看的,最好不要修改。


5.老生常谈的初始化
在定义一个指针的时候应该将其初始化,尤其是暂时不用到的初始化为nullptr;
不然指针乱飞就很恐怖类,虽然OS对关键区域有权限访问措施,但是“只有一个心脏怕也活不长”。

6.智能指针
智能指针实际上是将指针封装在一个类里,通过对象来管理指针,使得其生命周期结束时就over,而不用手动delete。
在C++库中最重要的类模板之一!
常见智能指针:
#include <memory>
auto_ptr: auto_ptr<int> p1(new int(10)); //定义一个智能指针p1指向一个int型变量,该变量的值初始化为10.
std::shared_ptr:shared_ptr<int> p2(new int(20));
weak_ptr:
unique_ptr:

 

 

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值