可能重复:
C++ delete - It deletes my objects but I can still access the data?
我试图在C / C ++中释放一块动态创建的内存。
但我使用的标准方法(malloc / free和new / delete)似乎都是功能失调的
下面给出的两个代码的o / p是相似的。
这是使用malloc / free的代码:
#include<stdio.h>
#include<stdlib.h>
int main(){
int * arr;
arr = (int *)malloc(10*sizeof(int)); // allocating memory
int i;
for(i=0;i<10;i++)
arr[i] = i;
for(i=0;i<10;i++)
printf("%d ",arr[i]);
printf("\n");
free(arr); // deallocating
for(i=0;i<10;i++)
printf("%d ",arr[i]);
printf("\n");
}
这是使用new / delete []的代码:
#include<stdio.h>
#include<stdlib.h>
int main(){
int * arr;
arr = new int[10]; // allocating memory
for(int i=0;i<10;i++)
arr[i] = i;
for(int i=0;i<10;i++)
printf("%d ",arr[i]);
printf("\n");
delete[] arr; // deallocating
for(int i=0;i<10;i++)
printf("%d ",arr[i]);
printf("\n");
}
但是,即使在释放内存后,也没有任何错误。
两种情况下的o / p相同:
0 1 2 3 4 5 6 7 8 9
0 0 2 3 4 5 6 7 8 9
那么,在C / C ++中解除内存释放的正确方法是什么?另外,为什么即使在释放内存后阵列也会被打印出来?
答案 0 :(得分:5)
因为解除分配/释放内存并不意味着取消或类似的内容。
释放内存(最有可能)只会将该内存标记为空闲,并且不会对其执行任何其他操作,直到其他内容再次使用它为止。
这使得释放内存更快。
您的代码中有未定义的行为,因为您正在阅读(使用)内存,而您根本不应该触摸它。它被“释放”并且使用该内存可能会导致任何问题。在最好的情况下崩溃。
答案 1 :(得分:2)
未定义的行为意味着可能发生任何事情。包括出现在工作中。
并且毫无疑问,当您访问已发布的内存时, 会遇到未定义的行为。就这么简单。
答案 2 :(得分:1)
系统可以自由地使用释放的内存执行任何操作,包括一切都没有。执行free
或delete
不会保证释放的内存将例如设置为零或任何其他值。数组中的值可能会发生变化。这可能是典型的行为。
但无论如何,使用或访问此内存在之后释放它是不正确的代码,并调用未定义的行为。
答案 3 :(得分:0)
内存已被释放,并已被提供给操作系统以执行其他任务。但是如果操作系统之间没有使用这个内存地址,那么该地址上的先前写入的数据仍然存在。您的程序输出可以随时给出不同的输出,即UNDEFINED行为。