C++ 如何清除堆上分配的未使用数组的全部内存
我对删除[]p有一些问题。我已经为测试这个函数编写了一些代码片段。但是我发现,在执行delete[]p之后,只有前2个数组元素被释放,而其余的没有。请参阅我的测试片段和输出结果,如下所示。谁能告诉我为什么以及如何清除未使用阵列的全部内存?谢谢C++ 如何清除堆上分配的未使用数组的全部内存,c++,arrays,dynamic,heap,delete-operator,C++,Arrays,Dynamic,Heap,Delete Operator,我对删除[]p有一些问题。我已经为测试这个函数编写了一些代码片段。但是我发现,在执行delete[]p之后,只有前2个数组元素被释放,而其余的没有。请参阅我的测试片段和输出结果,如下所示。谁能告诉我为什么以及如何清除未使用阵列的全部内存?谢谢 #include <iostream> using namespace std; int main() { int *p; p = new int[20]; for(int i=0;i<20;i++) {
#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;
}
内存被清除了——只是没有要求编译器在其析构函数中实际将int值归零。你看到的是,编译器认为这是不必要的,所以它仍然存在。不过会调用析构函数并释放内存 如果您执行以下操作,您可以更清楚地看到:
struct A {
int i;
A() : i(7) { }
~A() {
std::cout << "deleting A." << std::endl;
i = 0;
}
};
结构A{
int i;
A():i(7){}
~A(){
区分清除的内存和删除的内存是很重要的 当内存被清除时,它会被初始化为某个值(可能是全零)。但当内存被删除或释放时,它会返回到堆中。当内存被释放时,内存管理器没有义务清除内存。您看到的被更改的两个字节可能来自内存管理器用来帮助跟踪缓冲区的调试标记超支
如果你想清除所有的内存,你必须在删除之前完成它。只有在那个时候,你仍然拥有那个内存。删除它之后,在你没有拥有的内存上运行。< /P>查找C++ C++ 11的UnjyPPTR和AutoPyTR,用于旧的C++版本。错误,因为在删除[]后读取阵列时,正在访问进程未分配的内存。
struct A {
int i;
A() : i(7) { }
~A() {
std::cout << "deleting A." << std::endl;
i = 0;
}
};