一、内存分配方式
1. 从静态存储区域分配。内存在程序编译的时候就已经分配好了,这块内存在程序的整个运行期间都存在。例如全局变量、static变量,常量字符串。
2. 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。分配的内存容量有限。
3. 从堆上分配,也称为动态分配。程序在运行的时候用malloc或new申请内存,然后利用free或delete释放内存。分配比较灵活。
二、常见的内存错误
1. 内存未分配成功,却使用了它。如果p为指针,可以通过 if(p != NULL)来判断后续操作是否执行。
2. 内存分配成功,但是未初始化却使用它。
3. 内存分配成功并且已经初始化,但是操作越过了内存的边界。这种情况经常发生在数组的下标操作中。
4. 忘记释放内存,造成内存泄露。
5. 释放了内存,却仍然使用它。
(1)函数的return语句写错了,不要返回指向栈内存的指针或引用。
(2)使用了free或delete后,却没有把指针置为NULL,产生野指针。
三、有了malloc/free为什么还要new/delete?
malloc/free是C++/C语言的标准库函数。而new/delete是C++的运算符。它们都用于动态申请内存和释放内存。对于非内部数据类型的对象而言,只使用malloc/free无法满足条件,因为对象在创建的同时要自动执行构造函数,对象在消亡时要执行析构函数。
阅读(1064) | 评论(0) | 转发(0) |