回答
有可能是其他原因,但我想到的第一个问题是,你的某些类属性可能需要明确释放。
如果你的类只有两个int属性,那么当你调用delete myObject
时,这些属性将自动与对象一起被删除。但是,如果它包含任何动态分配的属性,那么这些属性将不会与对象一起释放,因此您需要在析构函数中明确删除它们。
除非它们由智能指针处理(它们应该是这样)。 – celtschk
如果析构函数的默认行为不是你想要的,你只需要定义一个析构函数。
当一个对象被销毁,析构函数做这些事,不管你自定义一个析构函数或不:
- 要求每个数据成员的析构函数。
- 调用每个基地的析构函数。
这实际上处理了你可能想要做的大多数事情。它曾经是常见的自定义一个析构函数时内存在构造函数中被分配:
struct A {
B *b_ptr;
A() : b_ptr(new B) { }
~A() { delete b_ptr; }
};
但是当你使用标准集装箱和智能指针,你需要一个自定义的析构函数的案件数量相对较少。举例来说,如果你有这样
struct A {
std::unique_ptr<B> b_ptr;
A() : b_ptr(new B) { }
};
一类是没有必要定义自己的析构函数,因为的std ::的unique_ptr将释放分配的内存。同样的,也没有必要界定,因为这里input_stream
struct B {
ifstream input_stream;
B(const std::string &path) : input_stream(path) { }
};
析构函数时INPUT_STREAM成员被破坏将自动关闭。
有时候,你需要做一些特殊的事情。您需要特殊的电话才能获取或释放资源。在这种情况下,你想有一个析构函数:
struct C {
ResourceHandle resource_handle;
C() : resource_handle(resouce_manager.acquireResource()) { }
~C() { resource_manager.releaseResource(resource_handle); }
};
但是尽可能多的,你要本地化的这种行为,使其不具备在许多类中复制。例如,你可能想使类是这样的:
struct ResourceHolder {
ResourceHandle resource_handle;
ResourceHolder() : resource_handle(acquireResource()) { }
~ResourceHolder() { releaseResource(resource_handle); }
};
现在你可以只使用一个ResourceHolder每个需要这些资源的一个类中,你永远不会有重复的获取和再次释放逻辑。
对于这个问题工作太多 – aaronman
析构函数不仅用于释放分配的内存,例如在构造函数中。
您可以通过使用析构函数实现RAII-style功能。的该利用此类型
实施例:
std::fstream
关闭打开的文件
std::lock_guard
解锁互斥
std::shared_ptr
递减一个基准计数器或自由存储器如果计数器是0
有2个实例需要定义析构函数:
- 你正在你的类的某个地方分配资源,也考虑拷贝构造函数和赋值操作符,即使它阻止它们被使用,你也可能需要定义它们。
- 该类将从中派生。在这种情况下,析构函数必须是虚拟的。原因是如果派生类将使用引用或指向包含派生类实例的父类的指针来析构,派生类的析构函数将不会被调用。
- 1. 什么时候以及为什么要将基类中的析构函数定义为虚拟的?
- 2. 为什么在定义子类的时候必须调用超类的构造函数?
- 3. 什么时候在C++中调用析构函数?
- 4. 什么时候注入构造函数,什么时候是CDI
- 5. 为什么你必须定义一个空的构造C++
- 6. 什么时候必须围绕try/catch?
- 7. 什么时候/为什么要使用自定义例外
- 8. 什么是PostgreSQL函数,什么时候我必须使用它们?
- 9. 在C++中,什么时候析构函数自动为局部向量调用?
- 10. 什么时候在php中使用析构函数?
- 11. 子类构造函数 - 为什么必须为子类构造函数存在默认构造函数?
- 12. 为什么子类必须在超类中调用no args构造函数?
- 13. 为什么必须在函数中包含C++代码?
- 14. 为什么虚拟函数必须在超类中实现?
- 15. 什么时候在C++中需要'int'?
- 16. 什么是复制构造函数,什么时候应该在C#中使用?
- 17. 在MFC中当调用EndDialog()时,类的析构函数什么时候触发?
- 18. C#多态 - 为什么&什么时候
- 19. 什么时候最好定义一个拷贝构造函数
- 20. 为什么原型必须在构造函数之外声明?
- 21. 为什么C++中需要析构函数?
- 22. 什么时候在C++中生成默认构造函数
- 23. 什么时候是file.close()必要的?
- 24. 为什么我需要定义自定义构造函数?
- 25. 什么时候在嵌套类中调用构造函数(Java)
- 26. 为什么必须N-1在C
- 27. 为什么模板必须在类
- 28. 为什么我必须在通用类
- 29. 什么时候/为什么要在回调函数中使用“return”
- 30. 为什么构造函数未定义?
可能出现[三条法则是什么?](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-reeree)。不是一个确切的副本,但任何人提出这个问题都会通过学习三条规则来了解他们应该知道的内容。 – Nemo
我不认为这是一个糟糕的问题,肯定是一个初学者的问题,但它不是一个主观问题,至少 – aaronman