如何清除堆上分配的未使用数组的整个内存

How to cleared off the whole memory for the unused array allocated on the heap

本文关键字:未使用 数组 内存 分配 何清除 清除      更新时间:2023-10-16

我对删除[] p有一些疑问。我已经编写了一些代码片段来测试这个函数。但我发现在执行 delete[] p 后,只有前 2 个数组元素被释放,而其余的则没有。请参阅我的测试片段和输出结果,如下所示。谁能告诉我为什么以及如何清除未使用阵列的整个内存?谢谢!

#include <iostream>
using namespace std;
int main()
{
   int *p;
   p = new int[20];
   for(int i=0;i<20;i++)
   {
       p[i]=i+1;
   }
    cout<<"------------------------Before delete-------------------------"<<endl;
    for(int i=0;i<20;i++)
   {
       cout<<"p+"<<i<<":"<<p+i<<endl;
       cout<<"p["<<i<<"]:"<<p[i]<<endl;
   }
    delete[] p;
        cout<<"-------------------After delete------------------------"<<endl;
    for(int i=0;i<20;i++)
   {
       cout<<"p+"<<i<<":"<<p+i<<endl;
       cout<<"p["<<i<<"]:"<<p[i]<<endl;
   }
   return 0; 
}

www.compileronline.com 输出

Compiling the source code....
$g++ main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 2>&1

Executing the program....
$demo
------------------------Before delete-------------------------
p+0:0xa90010
p[0]:1
p+1:0xa90014
p[1]:2
p+2:0xa90018
p[2]:3
p+3:0xa9001c
p[3]:4
p+4:0xa90020
p[4]:5
p+5:0xa90024
p[5]:6
p+6:0xa90028
p[6]:7
p+7:0xa9002c
p[7]:8
p+8:0xa90030
p[8]:9
p+9:0xa90034
p[9]:10
p+10:0xa90038
p[10]:11
p+11:0xa9003c
p[11]:12
p+12:0xa90040
p[12]:13
p+13:0xa90044
p[13]:14
p+14:0xa90048
p[14]:15
p+15:0xa9004c
p[15]:16
p+16:0xa90050
p[16]:17
p+17:0xa90054
p[17]:18
p+18:0xa90058
p[18]:19
p+19:0xa9005c
p[19]:20
-------------------After delete------------------------
p+0:0xa90010
p[0]:0
p+1:0xa90014
p[1]:0
p+2:0xa90018
p[2]:3
p+3:0xa9001c
p[3]:4
p+4:0xa90020
p[4]:5
p+5:0xa90024
p[5]:6
p+6:0xa90028
p[6]:7
p+7:0xa9002c
p[7]:8
p+8:0xa90030
p[8]:9
p+9:0xa90034
p[9]:10
p+10:0xa90038
p[10]:11
p+11:0xa9003c
p[11]:12
p+12:0xa90040
p[12]:13
p+13:0xa90044
p[13]:14
p+14:0xa90048
p[14]:15
p+15:0xa9004c
p[15]:16
p+16:0xa90050
p[16]:17
p+17:0xa90054
p[17]:18
p+18:0xa90058
p[18]:19
p+19:0xa9005c
p[19]:20

内存被清除 - 只是不需要编译器实际上会在其析构函数中将 int 清零。你看到的是编译器认为没有必要,所以它仍然存在。不过,调用析构函数并释放内存

如果您执行以下操作,您可以更清楚地看到这一点:

struct A {
    int i;
    A() : i(7) { }
    ~A() {
        std::cout << "deleting A." << std::endl;
        i = 0;
    }
};

并用A* p = new A[20];重复您的实验.

区分

清除的内存和删除的内存很重要。

当内存被清除时,它被初始化为某个值 - 也许都是零。但是,当内存被删除或释放时,它会返回到堆中。释放内存时,内存管理器没有义务清除内存。您看到正在更改的两个字节可能来自内存管理器用来帮助跟踪缓冲区溢出的调试标记。

如果要清除所有内存,则需要在删除之前执行此操作 - 只有在那时您仍然拥有该内存的所有权。删除后清除它是在您不拥有的内存上运行的。