如果我删除了一个类,它的成员变量会自动删除吗
If I delete a class, are its member variables automatically deleted?
我一直在研究,但没有任何相关的结果,所以我来到了这里。
我正在努力避免内存泄漏,所以我想知道:
假设我有一个类MyClass
,成员int
的a
和b
,以及一个int array c
,它们填充在一个成员函数中:
class MyClass
{
public:
int a, b;
int c[2];
void setVariables()
{
a, b = 0;
for (int i = 0; i < 2; i++)
{
c[i] = 3;
}
}
};
int main(int argc, char* argv[])
{
MyClass* mc = new MyClass();
mc->setVariables();
delete mc;
}
现在,在我调用delete mc
之后,a
、b
和c
的所有内容也会被删除吗?或者我必须在MyClass
的析构函数中显式地这样做吗?
规则很简单:用new
创建的每个对象必须用delete
销毁一次;用CCD_ 13创建的每个阵列必须用delete[]
精确地销毁一次;不能删除其他所有内容。所以你的代码是正确的;您是在使用new
创建mc
之后删除它,而不是删除未使用new
创建的成员。
当程序流变得复杂时(尤其是当涉及异常时),应用该规则可能相当棘手;因此,最好不要自己删除对象,而是立即使用new
的结果初始化一个智能指针来为您管理对象。
delete mc
时,编译器调用对象(MyClass::~MyClass()
)的析构函数,然后释放与之相关的内存。
默认析构函数(当您没有声明自己的析构函数时)通过声明按从最后到第一的顺序(即,在本例中,先是c
,然后是b
,再是a
)调用所有成员变量的析构因子。由于本例中的这些成员是POD类型(它们没有析构函数),因此不需要做任何工作。
类成员是类内存结构的一部分。
因此,当你释放内存时,成员们就会随之释放
注意:
如果你有指针,它们也会被破坏,但是它们指向的内存不会被破坏。
关于类内存消耗的更多信息:
C++类
类内部的变量具有类作用域,当类作用域为时会被销毁。您唯一需要担心的是指针——这些指针需要在析构函数中得到适当的处理。
对于您的具体示例,答案是肯定的。这是因为您在堆栈上分配了成员变量。如果您使用new
为成员变量分配内存,答案将是否定的,并要求您显式删除类析构函数中的成员变量。
class MyClass(): heapVariabl(NULL)
{
MyClass()
{}
~MyClass()
{
delete heapVariable;
}
int a, b;
int[2] c;
int *heapVariable;
void setVariables()
{
a, b = 0;
heapVariable = new int; // <- requires deletion in destructor to free memory
*heapVariable = 0;
for (int i = 0; i < 2; i++)
{
c[i] = 3;
}
}
}
释放对象时,其所有成员变量也会自动释放。所以,在您的情况下,是的,a
、b
和c
都被释放了。
但是,如果您的成员变量之一是指针,则只有指针本身会自动释放,而不是它所指向的对象-这是必须编写自己的析构函数的最常见情况。
delete
将回收对象包含的内存。如果您的类型维护指向动态分配内存的指针,那么您将需要在析构函数内部清理这些指针。
至于您的具体问题:
在我调用delete mc之后,a、b和c的所有内容也会被删除吗?或者我必须在MyClass的析构函数中显式地这样做吗?
它们将为您清理,因为它们不是动态分配的。
您的三个变量没有用new
分配,因此根本不需要删除它们。
当您的类为delete
d时,它们将被销毁(就像在您的类是new
d时分配的一样),但这与被删除不同。
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- std::ofstream 作为类成员删除复制构造函数?
- 删除C++继承中虚拟类成员的代码重复
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 我可以在此模板中删除此类成员吗?
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 派生的成员 通过指向基、static_cast、crtp、删除模板的指针
- 删除类成员的动态分配内存的最佳方法是什么
- C++类析构函数删除成员(如果"owner"?
- 在Visual Studio中删除成员std::vector::d ata()
- 为什么删除成员变量的复制构造函数不会阻止默认的复制构造函数
- 队列类中的非空删除成员函数
- 基于模板参数删除成员
- C++11 中已删除成员函数的确切语义是什么?
- 在C++中正确删除成员数组
- C++删除成员函数中的临时节点
- 在c++中,从结构体中删除成员会产生错误
- 如何删除成员函数中的成员数组,以便重新分配
- 状态设计模式 - 不想删除成员类中的此指针