return不能返回指向栈内存的指针
认真研读了林锐的<<高质量C++>>,其中指出return不能返回指向栈内存的指针或引用,根据书中所举的例子,自己有所疑问,希望哪个前辈解释一下!案例如下所示:
char *GetMemory(int num)
{
char *p = (char *)malloc(sizeof(char)*num);
return p;
}
void main(void)
{
char *str = NULL;
str = GetMemory(100);
strcpy(str, "hello world!");
cout << str << endl;
free(str);
str = NULL;
}
请教:例子中返回的指针P是不是指向栈内存,如果是,则函数结束时动态内存应该释放呀,那么该程序就运行出错,为什么书中的这个程序是正确的呢?
[解决办法]
我也正在学习中,不知道理解的对不对:
函数结束时,动态分配的内存并不释放.
动态分配的内存必须由程员来释放(当然,main()结束之后,系统都会回收).
它的执行过程应该是这样的:
char *p = (char *)malloc(sizeof(char)*num);//动态分配内存(在堆上分配);
return p;//将指针传到返回变量中,之后,p的作用域到此为止(从栈中清除);
str = GetMemory(100); //将函数返回的指针赋值给str;
这样str指向刚刚分配的内存.
free(str);//释放在堆上分配的内存