当你用C++;,什么时候编写自己的析构函数? 当您编写C++类时,您想编写自己的析构函数,重写默认的函数,我有点麻烦理解了吗?我理解析构函数的用途,只是当您不想使用编译器提供的析构函数时,我感到困惑。提前感谢。

当你用C++;,什么时候编写自己的析构函数? 当您编写C++类时,您想编写自己的析构函数,重写默认的函数,我有点麻烦理解了吗?我理解析构函数的用途,只是当您不想使用编译器提供的析构函数时,我感到困惑。提前感谢。,c++,C++,看一看和这个习惯用法,您将看到一些示例,说明我们为什么以及何时定义自己的析构函数。看一看和这个习惯用法,您将看到一些示例,说明我们为什么以及何时定义自己的析构函数。自定义析构函数用于释放您可能动态分配的资源。例如,如果您使用new或malloc分配了动态内存,如果您的类具有文件句柄成员变量或网络套接字,则自定义析构函数将确保所有这些资源都被释放/关闭。自定义析构函数用于释放您可能已动态分配的资源。例如,如果您使用new或malloc分配了动态内存,如果您的类具有文件句柄成员变量或网络套接字,那么

看一看和这个习惯用法,您将看到一些示例,说明我们为什么以及何时定义自己的析构函数。

看一看和这个习惯用法,您将看到一些示例,说明我们为什么以及何时定义自己的析构函数。

自定义析构函数用于释放您可能动态分配的资源。例如,如果您使用new或malloc分配了动态内存,如果您的类具有文件句柄成员变量或网络套接字,则自定义析构函数将确保所有这些资源都被释放/关闭。

自定义析构函数用于释放您可能已动态分配的资源。例如,如果您使用new或malloc分配了动态内存,如果您的类具有文件句柄成员变量或网络套接字,那么您的自定义析构函数将确保所有这些资源都被释放/关闭。

如果您不提供,编译器将为您添加一个,但这可能无法完成您需要它完成的任务。通常,如果您在类中手动分配静态存储内存(通常在构造函数中并使用
new
),则析构函数是必需的。如果您在类销毁时也不
删除它,那么该内存将不会被释放,并且内存泄漏=非常严重

但是,析构函数对于您希望在删除对象时执行的其他操作也很有用


我个人通常不编写析构函数,因为我从不分配内存,必须管理自己——由于大多数现代C++库中的指针和智能指针,通常可以指望内存使用它们自动释放。例如,Qt有

QSharedPointer
std
boost
有类似的自动内存管理类。

如果您不提供一个,编译器将为您添加一个,但这可能不符合您的需要。通常,如果您在类中手动分配静态存储内存(通常在构造函数中并使用
new
),则析构函数是必需的。如果您在类销毁时也不
删除它,那么该内存将不会被释放,并且内存泄漏=非常严重

但是,析构函数对于您希望在删除对象时执行的其他操作也很有用


我个人通常不编写析构函数,因为我从不分配内存,必须管理自己——由于大多数现代C++库中的指针和智能指针,通常可以指望内存使用它们自动释放。例如,Qt有

QSharedPointer
std
boost
有类似的自动内存管理类。

无论何时使用指针,都需要定义自定义析构函数。参加以下课程:

class Foo {
    public:
        Foo(int&);
        Foo();
        ~Foo(); //Custom Destructor
        int* getData();
        void setData();
    private:
       int* data;
    };
在这里,类
Foo
存储指向整数的指针。因为我们正在存储指针,所以当对象被销毁时,我们需要告诉C++删除那个指针指向的数据。为此,请按如下方式使用
delete
关键字:

Foo::~Foo() {
    delete data;
}
如果不指定自定义析构函数,则即使对象已销毁,也不会删除数据。虽然用来存储整数的4个字节看起来不多,但在使用许多对象的大型程序中,它可以累加起来


作为旁注(您可能还没有了解这一点,但值得一提),您应该始终将析构函数指定为虚拟的。这样,如果有人扩展该类,程序将调用正确的析构函数,而不是默认为基类(这是某些多态情况下的默认行为)

无论何时使用指针,都需要定义自定义析构函数。参加以下课程:

class Foo {
    public:
        Foo(int&);
        Foo();
        ~Foo(); //Custom Destructor
        int* getData();
        void setData();
    private:
       int* data;
    };
在这里,类
Foo
存储指向整数的指针。因为我们正在存储指针,所以当对象被销毁时,我们需要告诉C++删除那个指针指向的数据。为此,请按如下方式使用
delete
关键字:

Foo::~Foo() {
    delete data;
}
如果不指定自定义析构函数,则即使对象已销毁,也不会删除数据。虽然用来存储整数的4个字节看起来不多,但在使用许多对象的大型程序中,它可以累加起来


作为旁注(您可能还没有了解这一点,但值得一提),您应该始终将析构函数指定为虚拟的。这样,如果有人扩展该类,程序将调用正确的析构函数,而不是默认为基类(这是某些多态情况下的默认行为)

如果您在某处使用了
new
,您可能已经分配了需要清理的内存。默认析构函数不会这样做。编写析构函数或复制构造函数在实际中应该非常罕见。如果您在某个地方使用了
new
,则可能已分配了需要清理的内存。默认析构函数不会执行此操作。在的实际可能重复中,编写析构函数或复制构造函数应该非常罕见