在c++中,一个程序中的类是在什么时候调用它的析构函数的,是在程序结束时吗
22 个解决方案
在他的对象被干掉之后.
那么他的对象何时被干掉,有多种情况了。
如果这个类的对象是个局部对象,那么在对象退出作用域时调用析构函数。
如果是全局对象,则在整个程序结束( main() 函数中调用return(),exit()等等 )时析构。
如果这个对象被分配在自由存储区中,当delete 这个对象时调用析构函数。
同意eric8231(小诗),基本就是这三种情况。
其实即使在局部,比如说函数中,遇到return也会析构,虽然这是作用域可能并没结束。
总之,我觉得在你认为它该死的时候它就死了,^_^
楼上仁兄说的“对象被分配在自由存储区中”是怎么个情况?
(我是新手)
编译器在碰到}时调用析构
析构函数可以被跳过吗?goto 等语句???
当对象被消除的时候.
如果是在栈上的对象,则在离开对象作用域处,goto语句可以跳过作用域的结束处,即}处,所以goto是应该被禁止的,这个问题不必争论了.(Dijkstra!!!!!!
如果是在堆上的对象(动态,new),则当释放空间时(delete).
当然也可以显示调用,但这样不安全,应为当出现消除对象时还要再调一次,这时对象已经不存在了.
对于nirvana_ya的解释有疑问:
如果想上面所说的那样,goto 语句就是非法的了,如果存在goto 跳过 } 的情况,其中在栈中创建的局部变量,到底何时释放,如果没有及时释放岂不是造成堆栈不能平衡。
对于静态创建的对象,它的析构函数是不会被跳过去的,除非断电。^_^
对于动态创建的对象(如new),那么不用delete 就会跳过去。不过,这是不推荐的,因为内存会因此越来越少。直至系统瘫痪。
℃ ╭══╮
█┳ ┄ ┄ ╭╯□卐║
┛┗ ╰⊙═⊙╯oо○ 〇╭╮
回复人: eric8231(小诗) ( ) 信誉:100 2003-06-08 17:03:00 得分:0
如果这个类的对象是个局部对象,那么在对象退出作用域时调用析构函数。
如果是全局对象,则在整个程序结束( main() 函数中调用return(),exit()等等 )时析构。
如果这个对象被分配在自由存储区中,当delete 这个对象时调用析构函数。
Top
补充一点:
应该是4种,或者更多的情况
至少:
手动调用析构函数也可以,而且有时也非常必要
首先楼主的标题好象有点错误,不是类什么时候调用析构函数,应该是对象什么时候调用。
具体说到对象调用析构函数,是一个比较复杂的问题,比如说临时对象的产生和析构,欠套类对象的产生和析构,等等。
总之遇到具体问题要细心的具体分析才行啊。
感觉上面写的东西废话比较多:》
说明一下,刚才说的上面是说我自己说的话,可不是上面大家说的话啊
……——……
blizzardinto(董)
现在的编译器已经对goto的行为作了处理,如果goto跳过了},编译器会对{}队中的对象调用析构.
细细看书吧!都是些知识点的东西,另外,找一段代码,全部设置断点,然后一步一步调试,
那样会看到程序执行的情况!但是,没一不要分析:“为什么”?
不知道我这种土办法行不行。不要笑我呀!
程序用娄时就调用构造符,程序退出娄时就调用柝构符。
想切身体会一下的话,可以用调试模式运行一下程序就知道了