系统中的内存分为栈、堆、全局区、代码区
- 栈:由编译器自动分配释放,参访函数的参数值,局部变量,函数栈帧,函数调用过程。
- 堆:由程序员自行分配想要的空间大小,C中的malloc等函数,C++中的new
- 全局区(数据区):存放的是全局变量和静态变量,初始化的存在一起,未初始化的放一起,程序结束后由系统释放
- 代码区:存放函数体的二进制代码。
int tmp1 = 0; //初始化的全局变量(全局区)
static int tmp2 = 1;//初始化的静态变量(全局区)
short *p1; //全局未初始化区
static short *p2;//
int main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
int* tmp = new int(10);//堆区
}
由程序员自行分配管理的动态内存区:堆
C中:malloc、calloc、realloc/free
- malloc:申请指定字节数大小的内存空间,初始值不确定,返回值类型是(void*)
- calloc:分配指定大小空间,申请到内存每一位都初始化为0,返回值(void*)
- realloc:更改之前分配内存空间的大小(增容、缩小),增容后将原内容放到新的中。
C中用到以上函数进行动态内存开辟,有可能失败,所以要进行判空。 释放开辟空间:free,C中的动态内存释放用的是free,free之后将其指针置空。
C++中:new/delete
在C++中,申请动态内存开辟用的是new函数,而对new/delete来说分为操作内置类型和自定义类型。
- 内置类型:申请释放一段连续的空间,可以用到new int [ ]/delete [ ] ptr。
- 自定义类型申请空间:
- new的原理:new-----operator new( )-----构造函数,其中operator new底层实现用的是malloc
- delete原理:析构函数(完成对资源的清理工作)----operator delete( )
- new [N]:调用operator new[ ]( )----N次operator new( )-----N次构造
- delete[ ]:N次析构,operator delete[ ]( )中N次operator delete( )
new和malloc的区别:
- new申请空间的返回值就是new后面的类型,而malloc等的返回值是void*,需要强转
- new申请连续空间给出个数即可,而malloc需用到sizeof()计算
- new/delete是操作符,而malloc/free是函数
- new申请的空间可以初始化,malloc不行
- new可以申请自定义类型和内置类型,而malloc只能申请内置类型。
- new申请空间失败时会抛出异常,需要捕获异常,而malloc申请失败返回NULL,需要判空