先看例程:
1: CObject object;//在stack中生成对象。
2: CObject *pObject=new CObject;//在heap中生成对象。
请问大家:一、为什么第2种方法要用delete pObject;才能释放资源,而第1种是自动完成释放的。二、既然可以用这两种方法生成一个对象,那么什么情况下用第一种,什么情况用第二种呢?三、在stack中生成对象和在heap中生成有什么不同?(小弟理解heap是用特殊方式管理的一块内存区域,而stack是CPU的堆栈寄存器,不知道理解是不是对的?)就这么多请大家指教!
1: CObject object;//在stack中生成对象。
2: CObject *pObject=new CObject;//在heap中生成对象。
请问大家:一、为什么第2种方法要用delete pObject;才能释放资源,而第1种是自动完成释放的。二、既然可以用这两种方法生成一个对象,那么什么情况下用第一种,什么情况用第二种呢?三、在stack中生成对象和在heap中生成有什么不同?(小弟理解heap是用特殊方式管理的一块内存区域,而stack是CPU的堆栈寄存器,不知道理解是不是对的?)就这么多请大家指教!
因为你用了new 分配了内存 ,必须手动释放
第1种我想是编译器的事吧
二
有A,B类 B:A
A *a=new B; //这时要用new
那些在程序运行期间,大部分时间有用或者始终有用的我就放在队里,一定要注意
c,c++中里放在堆里的内存空间一定要手动释放,老程序员不会犯这种错误,但是
新手很容易忘,内存泄漏在一般的pc机上看不出什么问题,但是在对内存要求很高
的环境下,很容易就会用光内存,到时还检查不到什么错误~~~~~
heap手动释放
stack 是堆栈,堆栈寄存器是ESP。
函数调用通过ESP进行栈操作的,调用前将参数压栈,近回前出栈。这就是变量出定义域后自动失效的原因。
显然用NEW定义的变量编译后没有PUSH语句,而且它是存放在一块公共空间中,自然要用DELETE删除。
堆是C 语言特有(区别于一般的单片机语言)的概念,它是对冯氏结构的补充和增强
因为冯氏结构中函数返回时要“清栈”,会清空栈中的数据,而堆的好处就是在函数返回后能继续保存需要的数据