如何清除动态分配的内存,这是在堆中?

时间:2013-04-05 15:17:34

标签: c++ visual-studio-2010 pointers destructor

请查看以下代码

#include <iostream>

using namespace std;

class Memory
{
private:
    int *memory;

public:
    Memory()
    {
        memory = new int[3];

        for(int i=0;i<3;i++)
        {
            memory[i] = i;
            cout << memory[i] << endl;
        }
    }

    ~Memory()
    {
        delete[] memory;
    }
};

int main()
{
    cout << "Running" << endl;

    Memory m;
    // do I have to invoke ~Memory() ?

    int *secondMemory = new int[5];
    //How to clear the memory of 'secondMemory' ?

    system("pause");
    return 0;


}

在这里,我已经清除了类的析构函数中动态分配的memory数组的内存。但我的问题是

  1. 我是否必须调用~Memory()?
  2. 如何清除'secondMemory'的记忆?
  3. 这些问题在代码的适当位置作为注释询问。请帮忙!

    修改

    这里的问题是,如果我在main()中删除'secondMemory'的内存,那么一旦分配内存就会消失!

4 个答案:

答案 0 :(得分:8)

  

我是否必须调用~Memory()?

不,具有自动存储持续时间的对象(如m)在超出范围时会被销毁。换句话说,析构函数由系统自动调用。在这种情况下,mmain()函数返回时会被销毁。

  

如何清除'secondMemory'的记忆?

必须通过对new的相应调用销毁分配有delete的每个对象,并且必须通过对new[]的相应调用销毁分配有delete[]的每个数组:

delete[] secondMemory;

如果不这样做会导致内存泄漏

但是,请记住,使用原始指针执行手动内存管理在Modern C ++中被视为糟糕的编程习惯。而是尽可能使用标准容器,如std::vector<>

答案 1 :(得分:4)

  

我必须调用~Memory()

不,当对象超出范围时,会自动调用析构函数。

  

如何清除'secondMemory'的记忆?

使用delete[] secondMemory;

答案 2 :(得分:2)

 Memory m;
// do I have to invoke ~Memory() ?

这不是动态分配的,因此当m超出范围时,编译器会为您调用析构函数。在这种情况下main返回。

int *secondMemory = new int[5];
//How to clear the memory of 'secondMemory' ?

这是动态分配的,因此您必须解除分配。

delete [] secondMemory;

答案 3 :(得分:2)

  

我是否必须调用~Memory()?

当对象超出范围时,将自动调用~Memory()。所以不,你不必做任何事情来手动调用它。

  

如何清除'secondMemory'的记忆?

只需使用

delete [] secondMemory

因为您使用new和[]来初始化int* secondMemory