-2

请看下面的代码

#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”的内存?

这些问题在代码的适当位置作为注释提出。请帮忙!

编辑

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

4

4 回答 4

10

我必须调用 ~Memory() 吗?

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

如何清除“secondMemory”的内存?

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

delete[] secondMemory;

不这样做会导致内存泄漏

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

于 2013-04-05T15:18:57.403 回答
4

我必须调用 ~Memory()

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

如何清除“secondMemory”的内存?

采用delete[] secondMemory;

于 2013-04-05T15:19:03.753 回答
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;
于 2013-04-05T15:19:36.373 回答
2

我必须调用 ~Memory() 吗?

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

如何清除“secondMemory”的内存?

只需使用

delete [] secondMemory

int* secondMemory因为您使用 new 和 [] 进行了初始化。

于 2013-04-05T15:21:50.673 回答