堆,栈,静态存储区的区别是什么?什么时候用?
迷糊中.....
char *GetString(void) { char *p = "hello world"; return p;//函数结束时,p 的内存不释放吗? } void Test(void) { char *str = NULL; str = GetString(); cout<< str <<endl; }
up
char *p = "hello world"; 这种是放在静态存储区中的,程序结束的时候就会释放。放在栈里的是你在函数里定义一个变量,他就是放在栈里,当这个函数返回的时候就释放了。堆里的是当你new出来的都是放在堆里的,当你调用delete或进程结束的时候释放。
char *p = "hello world"; p是一个指针变量,在函数返回的时候,属于p的四字节空间也释放了,但是p的值"hello world"指针指向静态存储区的一个空间,这个空间存储字符串,这个空间直到程序退出的时候才释放。
在stack中分配的空间,生存期和函数一次调用一样,每次函数调用时分配,返回时释放;静态存储区分配的空间生存期和整个程序一样长,程序启动时分配,退出时释放;heap中分配的空间最灵活,在运行malloc、new等的时候分配,free、delete释放,完全由程序逻辑自由控制。 选择在那里分配空间,主要看你要存储数据的生存期,选择最匹配的机制分配。用heap最灵活,但是效率最低,容易造成碎片,正确性也难保证。
stonespace(stonespace): 静态存储区是为每个程序单独分配的一块内存吗? 如果在函数内部分配的(如上例,噢,对了,这个"hello world"是在什么时候分配的?刚开始或者是执行到该语句时?),在结束时也不释放,那不是很浪费(如果大的话)?什么办法让它释放呢?
还没问就回答了,:)
"hello world"是字符串常量,通常是在程序开始的时候分配的。如果你不想占用空间,可以把字符串放在资源里,用LoadString等方法在需要的时候装入内存。
如果在很多函数里有字符串常量,那占用的空间就是它们的和了,那是不太好 我把它改为:char str[]="hello world"; 可以的是不是(就是说不会再浪费空间了)?
char str[]="hello world"; 可能很编译器有关,在vc缺省设置下,你可以通过反汇编看到,"hello world"仍然被当作一个字符串常量,分配在静态存储区,然后在函数调用的时候,把这个字符串复制到str数组上,所以这样也不能节省空间,反而降低效率。 可能修改vc编译设置可以有另一种结果,我没试过。
这样呀,麻烦了,:(