【问题标题】:How to clear the dynamically allocated memory, which is in Heap? [duplicate]如何清除Heap中动态分配的内存? [复制]
【发布时间】:2013-03-28 01:57:16
【问题描述】:

请看下面的代码

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

这些问题在代码的适当位置以 cmets 的形式提出。请帮忙!

编辑

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

【问题讨论】:

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


【解决方案1】:

我必须调用 ~Memory() 吗?

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

如何清除“secondMemory”的内存?

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

delete[] secondMemory;

不这样做会导致内存泄漏

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

【讨论】:

  • 好的,但你的意思是我必须在内存分配之后调用它?我的意思是,就在 int *secondMemory = new int[5]; ?然后,内存被分配,它在几毫秒内就消失了!
  • @Yohan:您必须在失去对它的最后引用之前释放内存。在这种情况下,您必须在从main() 返回之前delete[](但在从main() 返回之前,您可以随时这样做)。
  • 顺便说一句,这种“现代 C++”风格的东西包括使用 RAII,这是 1990 年代语言中已经存在的功能。是的,它是现代的。
  • 嗯...好的,谢谢:)
  • @Andy 我最近看到很多声称这是一种不好的做法。你有明确的来源吗?虽然我同意它被过度使用并且大多数情况可以被标准容器替换,但它仍然是一般 C++ 内存管理的基本部分。我觉得,尤其是对于刚刚学习这门语言的人来说,他们应该清楚地了解它是如何工作的,然后再转向容器和其他高级概念,例如 RAII。
【解决方案2】:

我必须调用 ~Memory()

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

如何清除“secondMemory”的内存?

使用delete[] secondMemory;

【讨论】:

  • -1 表示不安全delete[]
【解决方案3】:
 Memory m;
// do I have to invoke ~Memory() ?

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

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

这是动态分配的,所以你必须解除分配。

delete [] secondMemory;

【讨论】:

  • -1 表示不安全 delete[]
  • @DeadMG 请解释一下。
  • @DeadMG 这些都不适用于给出的示例代码。我认为您的反对票是不公平的,并且说它不安全是一种误导。
  • @DeadMG 这些点超出了这个问题的范围——很遗憾你在此基础上对所有答案都投了反对票。
  • @DeadMG 在这里飞速拔剑 :)
【解决方案4】:

我必须调用 ~Memory() 吗?

当对象超出范围时,~Memory() 将自动被调用。所以不,您无需执行任何操作即可手动调用它。

如何清除“secondMemory”的内存?

随便用

delete [] secondMemory

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

【讨论】:

  • -1 表示不安全 delete[]
猜你喜欢
  • 2014-10-03
  • 1970-01-01
  • 2018-09-06
  • 2012-04-28
  • 2021-11-16
  • 2017-02-02
  • 2011-06-17
  • 2013-12-27
  • 1970-01-01
相关资源
最近更新 更多