要说c++内存管理,必须先研究一下c++的内存是如何分配的
- 栈: 程序种执行的函数内的局部变量都是在栈上面创建的,函数执行结束这些存储单元会被自动释放。栈的内存分配时内置于指令集之中的,效率极高,但是由于寄存器的容量限制,所以栈内分配的容量十分有限。
- 堆: 程序中使用new分配的内存块,它们的释放需要程序员去管理,编译器不负责。一个new要对应一个delete,若是程序员没有释放它们,程序结束后,操作系统会自动回收。
- 自由存储区: 由malloc分配的内存,类似于堆,它们由free进行释放。
- 全局/静态存储区: 全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
- 常量存储区: 这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
- 总结: c++内存分配方式看完了,我们大概就可以知道c++程序中哪些变量时放在哪块内存里面了。
跟内存有关问题
野指针
- 野指针不是NULL指针。
- 指针没有被初始化,造成野指针。
- 指针指向的对象已经被delete或free,然而使用的人不知道,还在使用。
- 超出作用域的使用指针,这种情况下,指针也变成了野指针。
怎么杜绝野指针?
- 用NULL指针初始化指针。
- 当使用delete/free操作指针后,给指针赋NULL。
- 在正确的作用域里使用指针。
常见的内存错误
- 内存未分配成功,却使用他。内存未分配成功,指针的值使NULL。好习惯是判断分配内存的指针是否为NULL,然后再使用它。
- 内存分配成功,但是未初始化,想当然的认为内存里的值应该是0.比如认为分配的数组初始值都是0,bool类型的值默认是false。这样都是不对的。好习惯是重新初始化分配好的内存,保证万无一失。
- 内存分配成功,也初始化,但是操作超出内存边界的内存。这个就是属于误用,不是自己的不要用,管理好自己分配的内存就好。
- 内存泄漏。一个函数中含有未释放的内存,每执行一次,内存泄漏一次,终有一次服务器的内存会消耗完。好习惯是,malloc和free成对出现,new和delete成对出现。
暂时就这么多,后面有空再写
- 堆与栈的区别?
- malloc/free与new/delete的区别?
- 指针数组中,指针放在哪,数组放在哪?
- 频繁的使用new/delete进行内存操作会有什么问题?
- c++编译器栈区一般多大?
- c++中堆的可分配空间有多大?什么是限制它大小的条件。
- c++中全局/静态区的大小是固定的吗?会根据程序的情况动态分配吗?常量区也是如此吗?
- c++自由存储区是不是也是从内存中分割出来的一部分?跟堆一样?有啥区别?