C++经典面试之 内存分配的三种方式

把所有的点都说到,才能说明你有足够的项目经验,在实际工作的时候不会因为一些小问题而产生一些严重的bug,也证明了你有实力胜任这份工作。

要回答这个问题,我们必须先要理解C++的内存管理方式,需要站在内存四区的角度去审视一下代码,这样整个理解了内存分配的方式,回答的时候就只需要注意一些细节了。写一个例子然后画一下内存示意图。

int getmem(char **myp,int length)
{
	if(myp==NULL)
	{
		return -1;
	}
	char *tmp=(char *)malloc(sizeof(char)*length);
	if(tmp==NULL)
	{
		return -2;
	}
	memset(tmp,0,length);
	/*
	memset(tmp,0,sizeof(tmp)//随手就写的,sizeof(tmp)是指针的大小,4个字节
	*/
	memcpy(tmp,"hello...",length);
	*myp=tmp;

}
int main()
{
	int a=10,*p1=NULL;
	char *p=NULL,*mystr="hello world";
	getmem(&p,10);
	printf("%s",p);
	free(p);
	p=NULL;
	system("pause");
	return 0;
}

上面代码的内存四区示意图:


理解之后就可以回答问题了:1、在栈上分配内存:函数中的临时局部变量分配在栈上,由操作系统自动分配,函数调用结束时内存也随之析构,栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。2、在静态存储区分配内存,这块内存在程序编译的时候就已经分配好,用来存放常量,全局变量和static变量,内存在整个程序运行周期内都存在。3、在堆区使用malloc或new申请内存,这种内存分配方式非常灵活,需要注意

①申请内存后立即判断指针是否为NULL确定内存是否分配成功,如果为NULL则立即用return终止此函数,或者用exit(1)终止整个程序的运行,为new和malloc设置异常处理函数;

②为申请的内存赋初值,分配的是一段连续的内存空间的话,要防止指针下标越界;

③sizeof是操作符,不能用sizeof得到内存空间的大小,只能在申请时候记住申请的空间大小;

④在内存使用结束后必须用free或delete释放内存,注意在内存使用中如果存在指针加1或减1 的操作应特别注意,释放的内存要和申请的内存一致,放置内存泄漏,释放内存后,应该立即将指针置为NULL,不要存在野指针。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值