迷糊中.....

解决方案 »

  1.   

    char *GetString(void)
    {
        char *p = "hello world";
        return p;//函数结束时,p 的内存不释放吗?
    }
    void Test(void)
    {
        char *str = NULL;
        str = GetString();
        cout<< str <<endl;
    }
      

  2.   

    char *p = "hello world";
    这种是放在静态存储区中的,程序结束的时候就会释放。放在栈里的是你在函数里定义一个变量,他就是放在栈里,当这个函数返回的时候就释放了。堆里的是当你new出来的都是放在堆里的,当你调用delete或进程结束的时候释放。
      

  3.   

    char *p = "hello world";p是一个指针变量,在函数返回的时候,属于p的四字节空间也释放了,但是p的值"hello world"指针指向静态存储区的一个空间,这个空间存储字符串,这个空间直到程序退出的时候才释放。
      

  4.   

    在stack中分配的空间,生存期和函数一次调用一样,每次函数调用时分配,返回时释放;静态存储区分配的空间生存期和整个程序一样长,程序启动时分配,退出时释放;heap中分配的空间最灵活,在运行malloc、new等的时候分配,free、delete释放,完全由程序逻辑自由控制。选择在那里分配空间,主要看你要存储数据的生存期,选择最匹配的机制分配。用heap最灵活,但是效率最低,容易造成碎片,正确性也难保证。
      

  5.   

    stonespace(stonespace):
    静态存储区是为每个程序单独分配的一块内存吗?如果在函数内部分配的(如上例,噢,对了,这个"hello world"是在什么时候分配的?刚开始或者是执行到该语句时?),在结束时也不释放,那不是很浪费(如果大的话)?什么办法让它释放呢?
      

  6.   

    "hello world"是字符串常量,通常是在程序开始的时候分配的。如果你不想占用空间,可以把字符串放在资源里,用LoadString等方法在需要的时候装入内存。
      

  7.   

    如果在很多函数里有字符串常量,那占用的空间就是它们的和了,那是不太好
    我把它改为:char str[]="hello world"; 可以的是不是(就是说不会再浪费空间了)?
      

  8.   

    char str[]="hello world"; 可能很编译器有关,在vc缺省设置下,你可以通过反汇编看到,"hello world"仍然被当作一个字符串常量,分配在静态存储区,然后在函数调用的时候,把这个字符串复制到str数组上,所以这样也不能节省空间,反而降低效率。可能修改vc编译设置可以有另一种结果,我没试过。