《程序员面试宝典》C/C++内存分配

4.2内存分配
4.2.1内存分配的形式
(1)符号起始的区块BBS段:用来存放程序中为初始化的全局数据和静态数据,程序结束后由系统自动释放
(2)数据段:用来存放已经初始化的全局变量
(3)代码段:存放程序执行代码,包括成员函数,全局函数和其他函数代码,在程序运行前就已经确定
(4)堆:存放被动态分配的内存段,大小不固定,使用new和malloc分配,delete和free释放,一般由程序员分配释放
(5)栈:存放程序零食创建的局部变量,包括{}内定义的变量(不包括static声明的变量)

int a = 0; //全局初始化区,数据段
char *p1; //全局未初始化区,BBS段

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);//分配得来得1020字节的区域就在堆区。
    strcpy(p1, "123456"); //123456\\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。        
} 

4.2.1内存泄漏
所谓内存泄漏是指由于疏忽或者错误造成程序未能释放已经不在使用的内存的情况。一般常说的内存泄漏是指堆内存泄漏。并且频繁的使用malloc和free等会产生内存碎片。对指针进行重新赋值,导致memoryArea之前的内容丢失,造成内存泄漏

char *memoryArea == malloc(10);
char *newArea == malloc(20);
memoryArea = newArea;

猜你喜欢

转载自blog.csdn.net/wangshuailpp/article/details/79895548