类析构函数的实际应用

问题描述 投票:0回答:6

我目前正在尝试了解类和构造函数/析构函数。我理解两者的作用,但我在析构函数方面遇到了困难,因为我想不出它的实际应用。

谁能提供一个例子并解释一下吗?

c++ class constructor destructor
6个回答
10
投票

析构函数是用于释放对象分配的任何资源的特殊成员函数。

最常见的例子是类的构造函数使用

new
,析构函数使用
delete
来释放内存。

class Myclass
{
    int *m_ptr;
    public:
        Myclass():m_ptr(new int)
        {
        }
        ~Myclass()
        {
             delete m_ptr;
        }
        //ToDo: Follow Rule of Three
        //Provide definitions for copy constructor & copy assignment operator as well

};

7
投票

析构函数可能是 C++ 最重要的方面,它为您管理资源,并允许您添加代码来处理任何特殊的清理,例如句柄释放、与套接字、数据库的断开连接等。Bjarne Stroustup 还指出,这是最好的之一关于析构函数的事情:

也有积极的惊喜。最壮观的是 与资源相关的技术中普遍使用析构函数 管理和错误处理(使用异常)。我知道析构函数 是个好主意——毕竟,你必须扭转 构造函数——但我并没有意识到它们对于 很好地使用了 C++。

原文:http://msdn.microsoft.com/en-us/magazine/cc500572.aspx

这对于成语 RAII(资源获取即初始化) 也很重要,Bjarne 在本文中对此进行了解释: http://www.artima.com/intv/modern3.html

您可以阅读有关析构函数的C++ 常见问题解答,这会对您有更多帮助。

我认为Als代码示例是一个很好的示例,您也可以查看维基百科文章中的代码示例,这也是另一个示例。当对象超出范围或调用

delete
时调用析构函数这一事实非常有用。我使用的是计时器对象类来计时某些函数调用需要多长时间:

class myTimer
{
  mytimer():startTime( TimeNow() )
  {}
  ~myTimer()
  { 
    printf("time taken :%I64d", TimeNow() - startTime);
  }
private:
  __int64 startTime;
};

所以在我的代码中我会做这样的事情

myClass::myFunction()
{
  myTimer timer; // initiliases time to Now.

  someOtherFunc();
} // mytimer object is now out of scope and the destructor is called and prints the time it took

2
投票

假设您有一个用于文件操作的类,例如

ifstream
并且您喜欢该文件自动关闭,类的实例消失。在析构函数中关闭文件句柄。


1
投票

当您拥有动态分配的对象组合时,这些功能最强大

假设我正在制作

linkedList
结构,该结构保存指向
linkedListNodes
的指针,列表将保存指向第一个元素的指针,并取决于单个或两个最后一个元素。

在析构函数中,我将删除列表中的所有元素,从而删除列表本身。

如果我不编写析构函数,那么当列表超出范围或调用了删除时,为这些元素分配的内存就会丢失,并且无法被系统回收(最显着的是称为内存泄漏)


1
投票

构造函数和析构函数是 RAII(资源分配即初始化)习惯用法中非常重要的部分。将资源(文件、内存、套接字、其他类对象)的获取与对象的生命周期联系起来是一个非常强大的工具。当对象超出范围时,无论是通过正常执行还是由于异常,调用对象析构函数都允许类正确清理其资源,而不必使用具有大量额外终结步骤的对象来增加代码负担。


1
投票

在这里扩展@Als的答案,例如你有一堂课,

class A {
    B* ptrB; // B is another class / struct / internal type
    A() { ptrB = new B(); }
}

int main() {
    A* ptrA = new A();
    // Do something with A
    delete ptrA; // This does not free ptrA->ptrB
}

为了解决这个问题,请在 A 中声明一个析构函数,如下所示,

~A() { delete ptrB; } // This is called every time delete is called on
                      // an object of A
© www.soinside.com 2019 - 2024. All rights reserved.