内存分配不当有什么后果?
引起堆栈溢出、缓冲区溢出等问题,容易使得系统瘫痪和崩溃。
内存分配形式有哪些?
(1)由符号起始的区块(BSS)段:用来存放程序中未初始化的全局数据和静态数据的一块内存区域,BSS段属于静态内存分配,程序结束后静态变量资源由系统自动释放。
(2)数据段:用来存放程序中已初始化的全局变量的一块内存区域。也属于静态内存分配。
(3)代码段文本段:用来存放程序的执行代码的一块内存区域。区域大小运行前确定,一般允许可读,可以共享。
(4)堆:用于存放进程运行中被动态分配的内存段,大小不固定,可以动态扩张或缩减,由程序员负责分配和释放,分配方式类似于链表。
(5)栈:用于存放程序临时创建的局部变量,由编译器自动分配、释放内存。使用寄存器来存取,效率高,分配内存容量有限。
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int global = 0; //全局初始化区
char *p1; //全局未初始化区
int main()
{
int a; //栈
char s[] = "abcdefg"; //栈
char *p2; //栈
char *p3 = "123456789"; // 123456789字符串在常量区,p3在栈上
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(100);
p2 = (char *)malloc(200); //分配得来的100和200的区域就在堆区。
strcpy(p1, "123456789"); // 123456789放在常量区,编译器可能会将它与p3所指向的
//“123456789”优化成一个地方
return 0;
}
什么是内存泄漏?
一般指的是堆内存的泄露,是指程序分配内存后程序未能释放已经不再使用的内存的情况失去了对该内存的控制,因而造成了内存浪费。
频繁使用malloc和free有什么后果?
会产生内存碎片(类似磁盘碎片)
如何通过自定义的函数检测内存泄漏?
做一个标志信息说明申请内存空间的代码在哪个文件下的某一行,如何程序运行结束时没有释放内存,那就打印一行信息,如果已经释放,不打印提示信息。