鱼C论坛

 找回密码
 立即注册
查看: 955|回复: 4

[已解决]C++ 析构函数不解之处

[复制链接]
发表于 2020-6-12 15:49:40 | 显示全部楼层 |阅读模式
10鱼币
#include <iostream>
using namespace std;

class A
{
public:
    A(){cout<<"构造函数执行完毕!"<<endl;}
    ~A(){cout<<"析构函数执行完毕!"<<endl;}
};

int main()
{
    A a;
    a.~A();

    return 0;
}

构造函数执行完毕!
析构函数执行完毕!
析构函数执行完毕!

为什么执行两次析构函数?
最佳答案
2020-6-12 15:49:41
这是我个人对构造析构函数的理解。
比如一个“班级”内存里面有很多很多的“对象”,现在有一个新的“对象”要进来了,然后这个“对象”又比较懒,入班手续什么都不想做。“班级”的管理员”老师“无奈之下只好帮这个“对象”做它的工作,但是有各种各样的“对象”,比如身高啊,体重啊,各种各样数据都不同。“老师”要怎么帮他做这些工作呢?只有根据这个“对象”的“信息”(构造函数)来做,终于把这个“对象”“班级”的工作做完了,“老师”本以为可以休息一下了。结果这个“对象”不仅懒还没有责任感。第二天什么征兆都没有了,直接消失不见了。那怎么办呢?这个“对象”已经办了进入“班级”的手续了,如果不办离开“班级”的手续,那么这个“班级”里面有很多资源都会被浪费。这是“老师”不能容忍的,所以“老师”没办法只好再帮他把离班手续办好,怎么办离班手续呢?就是根据“析构”来办的。终于算把这个“对象”的事情干完了。
但是事情往往没这么简单,越来越多的“对象”知道这件事情之后,也开始懒了起来。进班离班手续都交给“老师”做,结果渐渐的就形成了这种潜规则。“老师”也养成了习惯。每次一有对象进入和离开“班级”都会帮他办手续。结果某一天突然来了一个很勤快的“对象”,他在离开的时候自己去办了离班手续,但是这个老师已经养成了习惯,所以他也去帮这个勤快的“对象”办了一个离班手续,所以造成的你程序里面的状况,调用了两次析构函数

最佳答案

查看完整内容

这是我个人对构造析构函数的理解。 比如一个“班级”内存里面有很多很多的“对象”,现在有一个新的“对象”要进来了,然后这个“对象”又比较懒,入班手续什么都不想做。“班级”的管理员”老师“无奈之下只好帮这个“对象”做它的工作,但是有各种各样的“对象”,比如身高啊,体重啊,各种各样数据都不同。“老师”要怎么帮他做这些工作呢?只有根据这个“对象”的“信息”(构造函数)来做,终于把这个“对象”“班级”的工作 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-12 15:49:41 | 显示全部楼层    本楼为最佳答案   
这是我个人对构造析构函数的理解。
比如一个“班级”内存里面有很多很多的“对象”,现在有一个新的“对象”要进来了,然后这个“对象”又比较懒,入班手续什么都不想做。“班级”的管理员”老师“无奈之下只好帮这个“对象”做它的工作,但是有各种各样的“对象”,比如身高啊,体重啊,各种各样数据都不同。“老师”要怎么帮他做这些工作呢?只有根据这个“对象”的“信息”(构造函数)来做,终于把这个“对象”“班级”的工作做完了,“老师”本以为可以休息一下了。结果这个“对象”不仅懒还没有责任感。第二天什么征兆都没有了,直接消失不见了。那怎么办呢?这个“对象”已经办了进入“班级”的手续了,如果不办离开“班级”的手续,那么这个“班级”里面有很多资源都会被浪费。这是“老师”不能容忍的,所以“老师”没办法只好再帮他把离班手续办好,怎么办离班手续呢?就是根据“析构”来办的。终于算把这个“对象”的事情干完了。
但是事情往往没这么简单,越来越多的“对象”知道这件事情之后,也开始懒了起来。进班离班手续都交给“老师”做,结果渐渐的就形成了这种潜规则。“老师”也养成了习惯。每次一有对象进入和离开“班级”都会帮他办手续。结果某一天突然来了一个很勤快的“对象”,他在离开的时候自己去办了离班手续,但是这个老师已经养成了习惯,所以他也去帮这个勤快的“对象”办了一个离班手续,所以造成的你程序里面的状况,调用了两次析构函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-12 16:29:47 | 显示全部楼层
对象在销毁的时候,会自动调用一次析构函数,这个是由编译器分析出来的。

对于存在于栈上的变量,不需要手动调用析构函数。
对于存在于堆上的变量,
    1. 使用 delete 析构单个对象
    2. 使用 delete [] 析构数组对象

在现代 c++ 中,一般地,在析构函数中,负责析构(delete/free)内部的对象,在析构函数外,不应该存在 delete/free
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-12 16:41:46 | 显示全部楼层
赚小钱 发表于 2020-6-12 16:29
对象在销毁的时候,会自动调用一次析构函数,这个是由编译器分析出来的。

对于存在于栈上的变量,不需要 ...

好专业,能说的在白话一些吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-12 17:40:21 | 显示全部楼层
〃忝書γě渎ぐ 发表于 2020-6-12 16:41
好专业,能说的在白话一些吗?

你还是先去看书吧,基础太差了。c++ primer
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 15:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表