如果我删除了一个类,它的成员变量会自动删除吗

If I delete a class, are its member variables automatically deleted?

本文关键字:删除 成员 变量 一个 如果      更新时间:2023-10-16

我一直在研究,但没有任何相关的结果,所以我来到了这里。

我正在努力避免内存泄漏,所以我想知道:

假设我有一个类MyClass,成员intab,以及一个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之后,abc的所有内容也会被删除吗?或者我必须在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;          
     }     
   } 

} 

释放对象时,其所有成员变量也会自动释放。所以,在您的情况下,是的,abc都被释放了。

但是,如果您的成员变量之一是指针,则只有指针本身会自动释放,而不是它所指向的对象-这是必须编写自己的析构函数的最常见情况。

delete将回收对象包含的内存。如果您的类型维护指向动态分配内存的指针,那么您将需要在析构函数内部清理这些指针。

至于您的具体问题:

在我调用delete mc之后,a、b和c的所有内容也会被删除吗?或者我必须在MyClass的析构函数中显式地这样做吗?

它们将为您清理,因为它们不是动态分配的。

您的三个变量没有用new分配,因此根本不需要删除它们。

当您的类为delete d时,它们将被销毁(就像在您的类是new d时分配的一样),但这与被删除不同。