- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果我忘记在 C++ 类中声明析构函数,谁能告诉我对象的内存会发生什么情况?我的意思是,它是被释放还是导致内存泄漏?示例或演示将不胜感激。
提前致谢。
最佳答案
为任何重要的类定义析构函数通常被认为是好的做法(参见 Rule of Three )。然而,在现代 C++(即 C++11 之后)中,它不像以前那样必要了。
如果您的类不是从其他任何东西继承的,那么编译器提供的默认析构函数将正确销毁任何直接成员(例如变量和对象)。同样,如果您的对象拥有任何包裹在智能指针中的堆分配对象,它们也将被安全销毁。
如果您的对象通过原始指针拥有任何堆分配的数据,就会出现问题。隐式析构函数无法知道如何处理它们,因此您需要自定义析构函数来清除它们。例如:
class MyClass
{
int m_data1;
std::string m_data2;
std::shared_ptr<Widget> m_data3;
Widget *m_data4;
};
在上面的示例中,成员m_data1
、m_data2
和m_data3
都将在没有自定义析构函数的情况下被正确清除。但是,m_data4
指向的对象将不会 自动清除。如果它是由 MyClass
分配的,那么它通常会导致内存泄漏(除非它被其他东西释放)。
综上所述,继承以一种重要的方式改变了一切。如果你的类被其他任何东西继承,那么你应该总是给它一个虚拟析构函数。如果通过指向继承类的指针删除对象,并且该类没有有虚拟析构函数,则永远不会调用子类的析构函数,可能会导致内存泄漏。 p>
例如:
class Parent
{
public:
Widget m_data1;
}
class Child : public Parent
{
public:
Widget m_data2;
}
int main()
{
Parent *ptr = new Child;
delete ptr; // <-- clears-up Parent but not Child
}
在上面的例子中,ptr
是Parent
类型的,所以delete
只知道Parent
对象的一部分。这意味着只有 m_data1
会被正确清除。没有虚拟析构函数,它不知道对象的 Child
部分,因此 m_data2
将不会被正确清除(它的析构函数永远不会被调用)。
关于c++ - 缺少析构函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21088743/
我开始考虑在我 future 的项目或重构中实现控制反转容器,我想知道在正确设计依赖项时哪些原则(除了 GoF 模式)可能需要牢记在心。假设我需要构建一个简单的控制台应用程序,如果它可以访问互联网,它
假设我有一个 RxC contingency table 。这意味着有 R 行和 C 列。我想要一个维度为 RC × (R + C − 2) 的矩阵 X,其中包含行的 R − 1 “主效应”以及列的
我正在尝试使用 DKMS 为正在运行的内核 (4.4) 构 build 备树覆盖。我天真的 Makefile 如下: PWD := $(shell pwd) dtbo-y += my-awsome-o
我有一个 sencha touch 项目。我是用 phonegap 2.9 构建的,并且可以正常工作 device.uuid 返回到设备 ID。当我尝试使用 3.1 device.uuid 构建时抛出
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我正在尝试使用 Google Analytics Reporting API v4 构建多折线图。 一张图表,其中我按每天的 session 计数为每个设备(台式机/平板电脑/移动设备)设置了一条线。
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!