14. 指针与动态内存 - 内存泄露

印度小哥讲解的指针, 真的很好, 这里附上链接:
https://www.bilibili.com/video/BV1bo4y1Z7xf/?spm_id_from=333.999.0.0

1. 内存泄露

内存泄露指的是我们申请了内存, 但是使用完了之后, 也不进行释放, 就会造成内存泄露,

而且只有在 中才会出现 内存泄露.

1.1 举例说明

下面是一个游戏(可以多次玩), 能很好的说明对应的问题, 分为两种情况

  1. 上创建一个 char类型数组(char C[3] = { 'J', 'Q', 'K' };), 然后对应的空间是在 上创建的, 所以每一次栈都会自动进行回收.
  2. 上申请空间, 存放三个字母: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. 总结

内存泄露 是指不当地使用内存或者内存的堆区, 在一段时间内持续增长.

内存泄露 总是因为堆中未使用和未引用的内存块才发生的.

内存上的栈是自动回收的. 而且 的内存大小是固定的, 最多就是发生 栈溢出.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值