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

Kee*_*elx 25 c++ variables class member delete-operator

我一直在研究,没有任何相关的问题,所以我来到这里.

我试图避免内存泄漏,所以我想知道:

假设我有一个MyClass成员ints ab一个类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;
} 
Run Code Online (Sandbox Code Playgroud)

现在,我打电话后delete mc,会a,b以及所有的内容c被删除?或者我必须在析构函数中明确地做到这一点MyClass

Mik*_*our 34

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

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

  • +1不提类.这与类无关:无论你的变量声明在哪里,你只需要将`new`与`delete`和`new []`与`delete []`匹配.如果你没有使用`new`或`new []`,你不需要担心它. (3认同)

gre*_*ade 31

delete mc被执行时,编译器调用所述对象(的析构函数MyClass::~MyClass()),然后将释放与它相关的存储器中.

默认的析构函数(当你没有声明自己的时候)调用所有成员变量的析构函数,按顺序从头到尾依次声明(也就是说c,然后是b,然后a).由于此示例中的那些成员是POD类型(它们没有析构函数),因此无法完成任何工作.


Yoc*_*mer 6

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

因此,当你释放那些记忆时,成员就会被释放.

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

更多关于类内存消耗:

C++类


wan*_*vak 5

类内的变量具有类作用域,并在类存在时销毁。您唯一需要担心的是指针——它们需要在您的析构函数中适当地解决。


nat*_*han 5

对于您的具体示例,答案是肯定的。那是因为您在堆栈上分配了成员变量。如果您曾经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;          
     }     
   } 


} 
Run Code Online (Sandbox Code Playgroud)