【问题标题】:If I delete a class, are its member variables automatically deleted?如果我删除一个类,它的成员变量会自动删除吗?
【发布时间】:2011-09-09 12:48:37
【问题描述】:

我一直在研究,没有找到相关的东西,所以我来了。

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

假设我有一个类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;
} 

现在,在我调用delete mc之后,ab,以及c的所有内容也会被删除吗?还是我必须在 MyClass 的析构函数中明确地这样做?

【问题讨论】:

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


    【解决方案1】:

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

    默认的析构函数(当你不声明自己的时候)调用所有成员变量的析构函数,按从后到前的顺序声明(即本例中为c,然后是b,然后a)。由于本例中的这些成员是 POD types(它们没有析构函数),因此没有完成任何工作。

    【讨论】:

      【解决方案2】:

      规则很简单:用new 创建的每个对象都必须用delete 销毁一次;使用new[] 创建的每个数组都必须使用delete[] 销毁一次;不得删除其他所有内容。所以你的代码是正确的;您在使用new 创建后删除mc,而不是删除不是使用new 创建的成员。

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

      【讨论】:

      • +1 表示不提及课程。这与类无关:无论您的变量在何处声明,您只需将newdeletenew[]delete[] 匹配。如果您没有使用newnew[],则无需担心。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        因此,当您释放该内存时,成员也会随之释放。

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

        更多关于类内存消耗:

        C++ Classes

        【讨论】:

          【解决方案5】:

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

          当您的班级为deleted 时,它们被销毁(因为它们是在您的班级为newd 时分配的),但这与被删除不同。

          【讨论】:

            【解决方案6】:

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

            至于你的具体问题:

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

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

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

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

                【讨论】:

                  猜你喜欢
                  • 2021-06-30
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-01-28
                  • 2021-04-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多