先看例程:
1: CObject object;//在stack中生成对象。
2: CObject *pObject=new CObject;//在heap中生成对象。
请问大家:一、为什么第2种方法要用delete pObject;才能释放资源,而第1种是自动完成释放的。二、既然可以用这两种方法生成一个对象,那么什么情况下用第一种,什么情况用第二种呢?三、在stack中生成对象和在heap中生成有什么不同?(小弟理解heap是用特殊方式管理的一块内存区域,而stack是CPU的堆栈寄存器,不知道理解是不是对的?)就这么多请大家指教!

解决方案 »

  1.   

    一、为什么第2种方法要用delete pObject;才能释放资源
      因为你用了new 分配了内存 ,必须手动释放
      第1种我想是编译器的事吧

       有A,B类 B:A
       A *a=new B; //这时要用new
      

  2.   

    heap是系统中一块特殊的内存块,它中间的内存是由程序使用new之类进行分配的,并且每块分配的内存都会又一个头和尾的标记,当你用delete之类对其进行释放之前,别的程序是无法使用的。所以如果你不释放,是会造成内存泄露的。stack并不是CPU的堆栈寄存器,CPU的堆栈寄存器是用来进行函数调用时保存各寄存器的值并进行参数传递的。stack其实是一块普通的内存,当变量在stack上面分配的时候,系统会临时向这块内存写入数据,当出了作用域后,这块内存中的内容并不消失,但是被标记为可用,这样以后可以有其他的数据写在上面而冲掉原来的。
      

  3.   

    我用的时候,只要是临时指针,我都放在栈里,象链表,或者有些无模式对话框,
    那些在程序运行期间,大部分时间有用或者始终有用的我就放在队里,一定要注意
    c,c++中里放在堆里的内存空间一定要手动释放,老程序员不会犯这种错误,但是
    新手很容易忘,内存泄漏在一般的pc机上看不出什么问题,但是在对内存要求很高
    的环境下,很容易就会用光内存,到时还检查不到什么错误~~~~~
      

  4.   

    stack自动释放
    heap手动释放
      

  5.   

    看一看关于汇编语言的自然就懂了:
    stack 是堆栈,堆栈寄存器是ESP。
    函数调用通过ESP进行栈操作的,调用前将参数压栈,近回前出栈。这就是变量出定义域后自动失效的原因。
    显然用NEW定义的变量编译后没有PUSH语句,而且它是存放在一块公共空间中,自然要用DELETE删除。
      

  6.   

    栈是计算机本身(冯氏结构)的中的一个概念,我建议你去了解一下冯氏结构,他是CPU+Mem 的一个运算模型,看了以后保证你对C 语言的理解上一个层次(不是李宏志的层次)
    堆是C 语言特有(区别于一般的单片机语言)的概念,它是对冯氏结构的补充和增强
    因为冯氏结构中函数返回时要“清栈”,会清空栈中的数据,而堆的好处就是在函数返回后能继续保存需要的数据