如果我删除一个类,它的成员变量是否会自动删除?

时间:2011-06-06 18:38:10

标签: c++ class variables member delete-operator

我一直在研究,没有任何相关内容,所以我来到这里。

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

说我有成员MyClass s inta以及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后,ab还会删除c的所有内容吗?或者我是否必须在MyClass的析构函数中明确地执行此操作?

8 个答案:

答案 0 :(得分:32)

规则非常简单:用new创建的每个对象必须使用delete完全销毁一次;使用new[]创建的每个数组必须使用delete[]完全销毁一次;其他一切都不能删除。所以你的代码是正确的;您在使用mc创建new之后删除new,而不是删除未使用new创建的成员。

当程序流程变得复杂时(特别是涉及异常时),应用规则可能非常棘手;因此,最好不要自己删除对象,而是立即使用{{1}}的结果初始化智能指针来为您管理对象。

答案 1 :(得分:29)

执行delete mc时,编译器调用对象的析构函数(MyClass::~MyClass()),然后释放与之关联的内存。

默认的析构函数(当你没有声明自己的时候)按顺序调用所有成员变量的析构函数,从最后到第一个通过声明(即在这种情况下,c,然后{{1然后b)。由于此示例中的成员是POD types(他们没有析构函数),因此无法完成任务。

答案 2 :(得分:6)

类成员是类的内存结构的一部分。

所以当你释放那段记忆时,成员就会被释放。

注意:
如果你有指针它们也会被破坏,它们指向的内存不会被破坏。

有关课程内存消耗的更多信息:

<强> C++ Classes

答案 3 :(得分:4)

类中的变量具有类范围,并在类时被销毁。您唯一需要担心的是指针 - 需要在析构函数中正确解决这些问题。

答案 4 :(得分:4)

对于您的具体示例,答案是肯定的。那是因为你在堆栈上分配了成员变量。如果您使用new为成员变量分配内存,则答案为no,并且需要您显式删除类'析构函数中的成员变量。

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;          
     }     
   } 


} 

答案 5 :(得分:3)

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

但是,如果你的一个成员变量是一个指针,只有指针本身被自动释放,它指向的对象 - 这是必须编写自己的析构函数的最常见情况

答案 6 :(得分:1)

delete将回收对象包含的内存。如果你的类型保持指向动态分配内存的指针,那么你需要在析构函数内部清理它们。

至于你的具体问题:

  在我调用delete mc之后,将删除a,b和c的所有内容吗?或者我是否必须在MyClass的析构函数中明确地执行此操作?

它们将被清理,因为它们没有动态分配。

答案 7 :(得分:1)

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

当你的班级为delete d时(当你的班级为new d时分配它们), ,但这与被删除的不同。