C++内存管理个人见解

来源:互联网 发布:ip的数据报文格式 编辑:程序博客网 时间:2024/06/05 20:46

之前面试几家公司,都有询问过内存管理的问题,比如对堆栈的理解,比如内存泄露出现的原因以及解决方法等等,所以现在就根据自己所学的来总结下内存管理的问题,希望对大家有很好的用处;

首先要知道内存的划分的区域:

1.栈:存储局部变量,比如一个函数中的int i;然后出了这个函数就会释放掉,对于出栈的方式是先入后出,可以理解为一个函数中嵌套另一个函数,然后先肯定释放嵌套的函数中的局部变量,然后再释放外面一层的局部变量。

2.堆:new出来的内存块,比如new一个数组以及new一个对象:char *ms =new char[3];Thread thread=new Thread(function);谨记:new完之后一定要给delete掉,否则会造成内存泄露。

3.自由存储存区:是由malloc动态申请内存的区域。比如:char *ms;ms = (int*)malloc(sizeof(int) * 128);

对于malloc要用free进行释放掉。

4.静态存储区:比如全局变量和static修饰的变量存储的地方。

5.常量存储区;

其中,大家应该接触词语最熟悉的肯定是堆栈;对于堆栈的区别,我这里也简单的详解一下;

1.方便性:栈用完在跳出函数的时候会自动释放掉,而堆却需要手动释放。

2.效率性:栈是系统提供的数据结构,而堆是有c++函数库提供,所以栈的效率高于堆。

3.是否累积内存碎片:栈是有严格的先进后出,后进后出的进出栈顺序;堆是不断的new和delete,所以会造成内

存空间不连续,导致内存碎片。

4.空间大小不一样,堆空间有4G多,而栈默认为1M左右。

有很多人不知道内存泄露是什么意思:内存泄露其实就是你new了一个对象或者数组没有记性释放和删除。

数组越界:指的是你定义的数组长度小于你需要赋值的数组长度。

野指针:指的是在在一个函数中定义了一个指针,在跳出这个函数的时候指针指向的地址已经给释放掉了,但是你还用这个指针进行操作,那么这个指针就是野指针。比如:

Class A
{

void function();
}

void func2()

{

A  *a; //定义一个A类型的指针

{

A b;

a=&b; //这个指针指向b的地址

}

a->function();//这时候b已经释放了,没有这个地址了,所以这个a指针不知道指向哪里了;


}

如果担心内存耗尽没有分配内存区域,你在每次申请内存后对这个指针进行判断:

int *p =new int[4];

if(p == NULL)

{
return ;//或者是exit(1)

}




原创粉丝点击