印度小哥讲解的指针, 真的很好, 这里附上链接:
https://www.bilibili.com/video/BV1bo4y1Z7xf/?spm_id_from=333.999.0.0
1. 内存泄露
内存泄露指的是我们申请了内存, 但是使用完了之后, 也不进行释放, 就会造成内存泄露,
而且只有在 堆
中才会出现 内存泄露
.
1.1 举例说明
下面是一个游戏(可以多次玩), 能很好的说明对应的问题, 分为两种情况
- 在
栈
上创建一个char类型数组(char C[3] = { 'J', 'Q', 'K' };)
, 然后对应的空间是在栈
上创建的, 所以每一次栈都会自动进行回收. - 在
堆
上申请空间, 存放三个字母:char* C = (char*)malloc(3 * sizeof(char)) C[0] = 'J';
C[1] = ‘Q’; C[2] = ‘K’;但是若是最后我不进行显式的回收
(free函数)`, 那么最后只是将指向申请空间的指针清除, 但是堆中申请的内存没有被清除, 还是在一直占用着空间, 而且不会使用, 因为没有引用指向, 这样就会造成极大的内存泄露.
// 14. 指针与动态内存 - 内存泄露
int cash = 100;
void play(int bet) {
//char C[3] = { 'J', 'Q', 'K' };
char* C = (char*)malloc(3 * sizeof(char));
C[0] = 'J';
C[1] = 'Q';
C[2] = 'K';
printf("洗牌中..............\n");
srand(time(NULL));
for (int i = 0; i < 5; i++) {
int x = rand() % 3;
int y = rand() % 3;
int temp = C[x];
C[x] = C[y];
C[y] = temp;
}
int playersGuess;
printf("请输入1, 2, 3");
scanf("%d", &playersGuess);
if (C[playersGuess] == 'Q') {
cash += 3 * bet;
printf("你赢了, 你现在拥有的现金为:%d", cash);
} else {
cash -= bet;
printf("你输了, 你现在拥有的现金为:%d", cash);
}
free(C);
}
int main() {
int bet;
printf("欢迎来到猜数字游戏\n");
printf("你现在拥有的现金为:%d\n", cash);
while (cash > 0) {
printf("你现在想要赌多少钱? $");
scanf("%d", &bet);
if (bet == 0 || bet > cash) {
break;
}
play(bet);
}
return 0;
}
2. 总结
内存泄露
是指不当地使用内存或者内存的堆区, 在一段时间内持续增长.
内存泄露
总是因为堆中未使用和未引用的内存块才发生的.
内存上的栈是自动回收的
. 而且 栈
的内存大小是固定的, 最多就是发生 栈溢出
.