如何清除堆上分配的未使用数组的整个内存
How to cleared off the whole memory for the unused array allocated on the heap
我对删除[] 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];
重复您的实验.
区分
清除的内存和删除的内存很重要。
当内存被清除时,它被初始化为某个值 - 也许都是零。但是,当内存被删除或释放时,它会返回到堆中。释放内存时,内存管理器没有义务清除内存。您看到正在更改的两个字节可能来自内存管理器用来帮助跟踪缓冲区溢出的调试标记。
如果要清除所有内存,则需要在删除之前执行此操作 - 只有在那时您仍然拥有该内存的所有权。删除后清除它是在您不拥有的内存上运行的。
相关文章:
- C++使用数组作为多维数组,尽管将其初始化为带有指针的 1D
- 如何拆分文件中.txt字母并使用c ++使用数组进行扑克?
- 使用数组时出现问题
- 代码使用向量成功运行,但使用数组显示错误
- 为什么使用数组元素查找最大数字的程序不起作用?
- 在C++中使用数组时如何防止堆栈溢出?
- 使用数组数组调用 C++ 函数
- 从用户那里获得无限量的输入,而不是打印最大的3个,而不使用数组
- 使用数组C++的动态堆栈
- MongoDB 使用数组中的 OR 条件构建查询
- 如何使用数组 (C++) 读取具有未定义数量的值的 .txt 文件?
- 如何使用数组中的字符串打开文件
- 如何使用数组查找标准偏差
- 使用数组类返回数组c++
- 使用数组生成随机数
- 程序在初始化期间未与数组一起运行
- 使用数组将最后一个最大值更改为第一个最小值
- 在编译时使用数组中的字符串制作杂注
- 使用数组时未预期的功能
- 如何清除堆上分配的未使用数组的整个内存