把所有的点都说到,才能说明你有足够的项目经验,在实际工作的时候不会因为一些小问题而产生一些严重的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是操作符,不能用sizeof得到内存空间的大小,只能在申请时候记住申请的空间大小;
④(防泄漏)在内存使用结束后必须用free或delete释放内存,注意在内存使用中如果存在指针加1或减1 的操作应特别注意,释放的内存要和申请的内存一致,放置内存泄漏,释放内存后,应该立即将指针置为NULL,不要存在野指针。
转自:https://blog.csdn.net/lq18811566072/article/details/80331793