一个内存泄露的极端例子

曾经写过一个尽可能占用内存的程序


// max malloc.c

// 作者	@GNU计划

// 编译器 visual studio 2010

// 若有疑问或发现BUG可留言

#include <limits.h>

#include <stdlib.h>

int main ( void )

{
	// 此处尝试把i存放在CPU寄存器内 现在的CPU应该可以放得下4bytes 也就是sizeof(unsigned long)的长度

	register unsigned long i = ULONG_MAX ; // unsigned long类型的最大值 ( 2^32 ) - 1

	long double *pointer ;

	unsigned char *ptr ;

	unsigned char j = 7 ; // sizeof ( long double ) - 1 ;

	//申请一个数组 数组的长度为( 2^32 ) - 1而每个数组单元的类型为long double也就是8bytes 即一次申请 ( 2^32 ) - 1 再乘8bytes的连续内存空间
	// while ( NULL == ( pointer = ( long double * ) malloc ( ( i * sizeof ( long double ) ) ) )
	while ( !( pointer = ( long double * ) malloc ( i << 3 ) ) ) // i左移3位即i乘2的3次方也就是i * 8而8就是sizeof ( long double )

	{

		if ( i ) // i > 0

			--i ; // 若申请空间失败那么减1个数组长度再申请 即减sizeof ( long )的值 也就是减8bytes

		else // i == 0 如果连一个数组单元空间都申请失败 即连续8bytes的内存空间都申请失败

		{

			// 既然8bytes失败那么申请一个7bytes的内存连续空间

			// while ( NULL == ( ptr = ( unsigned char * ) malloc ( j ) ) )

			while ( !( ptr = ( unsigned char * ) malloc ( j ) ) )

			{

				if ( j ) // j > 0

					--j ; // 若申请失败就再减1byte

				else // j == 0 // 若1byte的内存空间都申请不了

					// 此处是死循环 为何用死循环?就是需要死循环因为一旦程序结束return 0了所有malloc的内存就都被编译器自动释放了

					continue ;

			}

		}

	}

	return 0 ;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值