七、内存管理
其实上述许多已经提到的注意要点追根究底的原因就是内存管理的内容,例如返回值是指针类型和引用类型时是否是正确的。在这个部分,或许能更加准确的找到答案。
1.内存分配方式
分配方式分三种:从静态存储区分配;在栈上分配;在堆上分配。下面来讨论他们的区别。
在静态存储区分配:内存在程序编译时候就已经分配完毕,这块内存在程序整个运行过程都存在,主要存放静态变量和全局变量;
在栈上分配:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些内存单元被释放,这就是为什么不可以将指向或表示栈上内存单元的指针或引用作为结果返回的原因吧;
在堆上分配:也叫做动态内存分配,程序在运行时利用malloc和new等方法申请的内存都分配在堆上,程序员需要自行利用free或delete将其释放掉,这也就是为什么在函数内利用这两个函数初始化指针时,可以将该指针作为结果返回的原因吧。因为该指针是指向堆空间的,在函数结束后,该内存不会被释放,指针不会成为野指针。
2.常见的内存错误及对策
第一次用指针的地方,要么利用函数初始化了,要么就赋值NULL。不要什么都不做,就做个声明。
在delete或free掉指针之后,要将该指针重新置为NULL,防止野指针的使用。
3.指针和数组的对比
char *p = "hello world !";
p[0] = 'H'; //这是错误的,"hello world !”是常量字符串,位于静态存储区,内容是不能被改变的。
指针的大小是4字节
4.指针参数是如何传递内存的? 画图理解。
5.free和delete把指针怎么了? 简单的说,只是把指针所指的那块内存空间释放了而已。指针本身不变
6.动态内存会被自动释放吗? 不会,谢谢。不管会不会,总之固定使用new/delete,malloc/free配对就是了。
7.杜绝“野指针”
8.有了malloc/free 为什么还要 new/delete ?
new/delete 做的事情比 malloc/free 来的多,多了对象初始化和对象析构,但是 malloc/free 又是必不可少的,因为c++程序缺少不了c程序中唯一管理动态内存的 malloc/free。
再说了, malloc/free 是库函数, new/delete 是运算法,有定义上的区别。
9.内存耗尽怎么办?
认真好好写程序,好好对待内存,想耗尽都困难,除非是70年代的电脑。善待 malloc/free new/delete