我是C ++的新手,已经尝试过它。今天我正在进行动态内存分配。根据以下链接:
http://msdn.microsoft.com/en-us/library/h6227113.aspx
“在对象上使用delete运算符释放其内存 删除对象后取消引用指针的程序即可 有不可预知的结果或崩溃。“
但是在下面的示例中,即使使用删除后,当我尝试打印该位置的包含时,它会打印正确的值?怎么样?
我真的很困惑....请指导我?谢谢。
int main()
{
int max_Value = 12;
int *arr = new int [max_Value];
arr[4] = 9;
cout<< "arr of four is having: "<<arr[4]<<endl;
delete[]arr;
int i = 0;
for(i=0; i<12; i++)
cout<< arr[i]<<endl;
return 0;
}
答案 0 :(得分:1)
当您delete
(或delete[]
)指针时,您基本告诉底层系统您将不再使用此内存块。系统现在拥有集团,并可以使用它(例如:分配其他东西)。
在您的情况下,删除后没有工作,因此释放的内存块仍未触及。你不能依赖它,这是一个特例。您可以尝试进行其他new
分配,用数据填充并观察旧的指针数据,您可能会发现内存块受到其他写入操作的影响。
这是我的结果,YMMV,我们明确处理未定义的行为:
int main() {
int max_Value = 12;
int *arr = new int[max_Value];
arr[4] = 9;
cout << "arr of four is having: " << arr[4] << endl;
delete[] arr;
// print old data
for (int i = 0; i < 12; i++)
cout << arr[i] << " ";
cout << endl;
// another write (overwrite?) operation
int *arr2 = new int[max_Value];
for (int i = 0; i < 12; i++)
arr2[i] = -1;
// print again old data
for (int i = 0; i < 12; i++)
cout << arr[i] << " ";
return 0;
}
输出
arr of four is having: 9
3619976 3615400 0 0 9 62374 3604676 3611152 0 0 0 0
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
删除的数据由OS提供给你!
答案 1 :(得分:0)
当你在C ++中delete
一个对象时,它的内存不会消失 - 它只是标记为未使用。与从硬盘驱动器中删除文件后有时可以恢复部分或全部文件的方式相同,将来读取已删除的对象地址可能包含以前存在的数据的残余。但是,您不应该故意这样做,因为这种访问会导致segfault并导致程序崩溃。
答案 2 :(得分:0)
它没有崩溃,因为你编译了Runtime Error Checks已禁用。您可以使用/RTC compilation开关启用它们。
MSDN谈论不可预测的行为,因为它确实无法预测:下次你会尝试分配动态内存时,有可能(部分)获得(部分)同一区域,你最近解除了分配。这将导致您的程序在两个(或更多)位置使用相同的内存区域,同时假设只有一个访问它。结果会是什么? 不可预测 - 取决于您的代码。