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

I have been researching, and nothing relevant has come up, so I came here.

I am trying to avoid memory leaks, so I am wondering:

Say I have class MyClass with member int s a and b , and an int array c , which are filled in a member function:

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

Now, after I call delete mc , will a , b , and all the contents of c be deleted as well? Or will I have to do that explicitly in the destructor of MyClass ?


When delete mc is executed, the compiler calls the destructor of the object ( MyClass::~MyClass() ) and then deallocates the memory associated with it.

The default destructor (when you don't declare your own) calls the destructors of all member variables, in order from last to first by declaration (that is, in this case, c , then b , then a ). Since those members in this example are POD types (they do not have a destructor), no work is done.


The rule is very simple: every object created with new must be destroyed exactly once with delete ; every array created with new[] must be destroyed exactly once with delete[] ; everything else must not be deleted. So your code is correct; you are deleting mc after creating it with new , and not deleting the members which were not created with new .

Applying the rule can be quite tricky when the program flow gets complicated (especially when exceptions are involved); for that reason, it is much better not to delete objects yourself, but to immediately use the result of new to initialise a smart pointer to manage the object for you.


Variables inside of a class have class scope and are destroyed when the class is. The only thing you need to worry about is pointers -- those will need to be addressed appropriately in your destructor.

链接地址: http://www.djcxy.com/p/40312.html

上一篇: 我应该使用C ++中的结构吗?

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