内存分配的三种方式

把所有的点都说到,才能说明你有足够的项目经验,在实际工作的时候不会因为一些小问题而产生一些严重的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张图片理解之后就可以回答问题了:

1、在栈上分配内存:函数中的临时局部变量分配在栈上,由操作系统自动分配,函数调用结束时内存也随之析构,栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

2、在静态存储区分配内存,这块内存在程序编译的时候就已经分配好,用来存放常量,全局变量和static变量,内存在整个程序运行周期内都存在。

3、在堆区使用malloc或new申请内存,这种内存分配方式非常灵活,需要注意

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

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

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

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

转自:https://blog.csdn.net/lq18811566072/article/details/80331793

你可能感兴趣的:(面试)