char *strTemp[] = {"sdf", "ddd", "sdsdsd"};
for(int i=0; i<3; i++)
   printf("the string is %s\n",strTemp[i]);
为什么不用释放strTemp内存
char *cTemp = "dddddddd";
....
也不用delete[]cTemp;加上后编译正常,运行错误。
char *temp = new char[20];
temp = "ddddddd";
printf("%s\n", temp);
居然还不用delete[]cTemp;加上后编译正常,运行错误。哪位高手可以系统的讲一下何时需要释放内存,何时不用?谢谢了!

解决方案 »

  1.   

    char *strTemp[] = {"sdf", "ddd", "sdsdsd"};这个创建的字符串好像是放在栈中的,程序结束后自动会释放的,不用delete。char *cTemp = "dddddddd";
    也是在栈中分配空间,虽然编译能通过,但是用delete的话,那个指针是非法的。
    char *temp = new char[20];
    应该最后用delete temp;
    否则会造成内存泄漏的。
      

  2.   

    这不是用malloc或new申请的空间,不用delete 或free的。下面应该delete的。但是你的程序有一些问题。
      

  3.   

    char *strTemp[] = {"sdf", "ddd", "sdsdsd"};这个创建的字符串好像是放在栈中的,程序结束后自动会释放的,不用delete。char *cTemp = "dddddddd";
    也是在栈中分配空间,虽然编译能通过,但是用delete的话,那个指针是非法的。
    char *temp = new char[20];
    应该最后用delete temp;
    否则会造成内存泄漏的。
      

  4.   

    同意dnyz(hcl)的观点,不过最后temp已经指向另一个内存空间"dddddddd",而不是原来new分配的地址了!!!
    所以,如果你用delete释放当然是不对的了,而且造成了内存泄漏。
    正确的把"dddddddd"放到分配的temp指针地址的方法应该用相应的库函数来做,比如:strcpy(temp,"dddddddd");这样就不会有问题了
      

  5.   

    同意楼上的:
    char *temp = new char[20];
    new char[20]在“堆”中分配了20个字节的空间,temp指向这块新分配的内存,
    temp = "ddddddd";
    "ddddddd"这个字串在“栈”中分配了空间,同时temp改变指向,指向了"dddddd"这块空间。
    注意:此时没有任何指针new char[20]所分配的空间,因此你再也没有办法找到这块空间了,造成的后果就是你没法释放它了,这就是所谓的内存泄漏。你可能对堆和栈的概念不太了解,给你粗浅说一下,局部变量的空间在栈中;全局变量,静态变量,和new的是分配在堆中,函数返回后,栈中的内容都会被释放,所以也就不存在内存泄漏,而在堆中的只要一分配,就会一直存活到程序结束。所以你要对new的东西格外小心,至少应该保证有一个指针指向它,否则它就成为不可控制的了。
      

  6.   

    dnyz(hcl),应该是  delete []cTemp吧!
      

  7.   

    char *strTemp[] = {"sdf", "ddd", "sdsdsd"};是指向一个c语言的字符串的指针,没有进行动态内存分配,当然不用释放内存了
      

  8.   

    char *strTemp[] = {"sdf", "ddd", "sdsdsd"};声明的是一个指向c语言类型的字符串,相当于以下声明char strTemp[][3] = {"sdf", "ddd", "sdsdsd"};
    不涉及动态内存分配,当然不用释放内存了.
      

  9.   

    请Batizhou(Batizhou)详细讲一下堆和栈的概念,并再解释一下局部变量和全局变量在C或C++ 中的实现。
    小弟先谢谢了!
      

  10.   

    batizhou(batizhou)你的话真是精辟,多谢了!有人想继续这个帖子,所以我暂不结贴,谢谢大家!
      

  11.   

    学过汇编的人都知道几个段,代码段,堆栈段,数据段。
    我们写的代码,编译后是放在代码段中,当然只有代码没有数据程序是无法执行的,当代码段需要数据时,它会根据实际情况到堆栈段中或数据段中取。
    刚才所说的栈,就是放在堆栈段中的,每进行一次函数调用时就会压栈,保存一些必要的信息并分配局部变量所需的空间,由于每个函数中定义的局部变量肯定是固定的,所以每个局部变量的存储位置相对于栈底是固定底。例如有个函数中定义了两个局部变量int a,b;则每次调用该函数时他们距离栈底底距离都是4和8;我们的程序都是存放于代码段之中的,这个4和8自然也是放在代码段中,代码执行时通过栈底和4或8就能找到变量a和b了。函数执行完返回时会出栈,刚才压底栈全部被弹出,函数返回,栈中底内容全被释放,所以局部变量不存在释放问题。
    而静态变量,全局变量和new,malloc的空间都在数据段中,静态和全局变量的位置也是存在代码段中,例如我们定义了两个static int c,static int d,他们在堆中的位置0x22334450,0x22334454,代码段中的c和d就被0x22334450,0x22334454代替了。因此每次代码访问c和d其实就是在访问0x22334450,0x22334454,而访问a和b实际实在访问“栈底+4”和“栈底+8”,随着栈底的不同,访问的实际东西也不同。这就是局部变量和全局(静态)变量的区别。注:0x22334450,0x22334454不是绝对地址,而是相对于数据段起始地址(不变的)而言,栈底(变动的)表示堆栈浮动的一端!