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)
}
- C++内存管理个人见解
- ios 内存管理个人一些见解
- ARC 内存管理见解
- IOS 内存管理见解
- Objective-C 关于内存管理的一些见解
- 80386内存寻址机制(个人见解)
- 80386内存寻址机制(个人见解)
- 关于项目管理的一些个人见解
- 个人学习C语言的见解
- C语言左值右值的个人见解
- cocos2d-x内存管理(见解)
- Java中的堆内存和栈内存个人见解
- Android 内存泄露的一点个人小见解
- 个人关于管理一些中型程序的见解
- 关于研发管理的几点个人见解(-)
- 对C#.NET编程规范的个人见解
- 对C#.NET编程规范的个人见解
- 对C#.NET编程规范的个人见解
- lintcode--跳跃游戏
- static
- Cannot mix incompatible Qt library (version 0x40805) with this library (version 0x40801)
- 信号延迟一个单位
- char & string 与 int 类型的互换方法
- C++内存管理个人见解
- bootstrap详解(CSS)
- 利用Android广播机制关闭多个activity
- surfaceview的详解和使用
- selenium使用chrome时,报错ignore certificate errors
- OC中NSString 的常用方法
- Unity Mathf 数学运算(C#)
- <Android APK签名验签>二:META-INF文件分析
- 数据库备份的几种类型