类析构函数的实际应用

时间:2012-04-25 06:35:40

标签: c++ class constructor destructor uses

我目前正在尝试学习类和构造函数/析构函数。我理解这两个人做了什么,但是我在使用析构函数时遇到了困难,因为我无法想到它的实际应用。

有人可以提供解释的例子吗?

6 个答案:

答案 0 :(得分: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

};

答案 1 :(得分:7)

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

  

也出现了积极的意外。最壮观的是   在与资源有关的技术中普遍使用析构函数   管理和错误处理(使用例外)。我知道析构函数   是一个好主意 - 毕竟,你必须扭转a的影响   构造函数 - 但我并没有意识到它们的重要性   好好利用C ++。

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

这个成语RAII (Resource Acquisition Is Initialisation)也很重要,Bjarne在本文中对此进行了解释: http://www.artima.com/intv/modern3.html

你可以在析构函数上阅读这个C++ faq,它可以为你提供更多帮助。

我认为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 :(得分:2)

想象一下,你有一个文件操作类,例如ifstream并且你喜欢这个文件自动关闭,类的实例消失了。关闭析构函数中的文件句柄。

答案 3 :(得分:1)

当你拥有动态分配对象的组合时,它们拥有最强大的力量

说我正在制作linkedList结构,其中包含指向linkedListNodes的指针,列表将保存指向第一个的指针,并依赖于单个或双倍的最后一个元素。

在析构函数中

我会删除列表中的所有元素,因此也就是列表本身。

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

答案 4 :(得分: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

答案 5 :(得分:1)

构造函数和析构函数是RAII(资源分配是初始化)习惯用语的重要组成部分。将资源(文件,内存,套接字,其他类对象)的获取链接到对象的生命周期是一个非常强大的工具。当一个对象超出范围时,无论是通过正常执行还是由于异常,调用对象析构函数都允许类正确地清理其资源,而不必使用具有大量额外完成步骤的对象来加重代码。 / p>