堆,栈,静态存储区的区别是什么?什么时候用? 迷糊中..... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 char *GetString(void){ char *p = "hello world"; return p;//函数结束时,p 的内存不释放吗?}void Test(void){ char *str = NULL; str = GetString(); cout<< str <<endl;} 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编译设置可以有另一种结果,我没试过。 PC通过串口读取rs232条码扫描枪扫描的条码问题 CDialog更改系统菜单问题 发现微软创造出的.net用的还是vc 6.0 ODBC数据库编程 HOOK API后,主线程LoadLibrary加载DLL,这时需要重新HOOKLoadLibrary加载的DLL,难道又复制一个函数。有没有什么简便的方法。 在DLL里面怎么创建对话框? 一个背景的问题? 关于vc的对话框的小问题. 大家快到这个网站来看一看呀,不看一定后悔。 怎么实现对文件夹的浏览选定? 我怎么才能截获对话框中的按ENTER键的消息,并进行处理(此时我的OK按键已被我删除)在先等待 索引算法设计
{
char *p = "hello world";
return p;//函数结束时,p 的内存不释放吗?
}
void Test(void)
{
char *str = NULL;
str = GetString();
cout<< str <<endl;
}
这种是放在静态存储区中的,程序结束的时候就会释放。放在栈里的是你在函数里定义一个变量,他就是放在栈里,当这个函数返回的时候就释放了。堆里的是当你new出来的都是放在堆里的,当你调用delete或进程结束的时候释放。
静态存储区是为每个程序单独分配的一块内存吗?如果在函数内部分配的(如上例,噢,对了,这个"hello world"是在什么时候分配的?刚开始或者是执行到该语句时?),在结束时也不释放,那不是很浪费(如果大的话)?什么办法让它释放呢?
我把它改为:char str[]="hello world"; 可以的是不是(就是说不会再浪费空间了)?