我目前正在尝试学习类和构造函数/析构函数。我理解这两个人做了什么,但是我在使用析构函数时遇到了困难,因为我无法想到它的实际应用。
有人可以提供解释的例子吗?
答案 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>