C / C ++:解除分配或删除动态创建的内存块

可能重复:
C ++ delete – 它会删除我的对象,但我仍然可以访问数据?

我试图在C / C ++中释放一块动态创建的内存。
但是我使用的标准方法(malloc / free和new / delete)似乎都是function失调的。
下面给出的两个代码的o / p是相似的。
这是使用malloc / free的代码:

#include #include 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 #include 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 ++中解除内存释放的正确方法是什么? 另外,为什么即使在释放内存后arrays也会被打印出来?

因为解除分配/释放内存并不意味着取消或类似的东西。

释放内存(最有可能)只会将该内存标记为空闲,并且不会对其执行任何其他操作,直到其他内容再次使用它为止。

这使得释放内存更快。

您在代码中拥有的是未定义的行为 ,因为您正在阅读(使用)内存,而您根本不应该触摸它。 它被“释放”并且使用该内存可能会导致任何问题。 在最好的情况下崩溃。

未定义的行为意味着任何事情都会发生 。 包括出现在工作中。

并且不要搞错,当您访问已发布的内存时,您遇到未定义的行为。 就那么简单。

系统可以自由地使用释放的内存做任何事情,包括一切都没有。 执行freedelete 不会保证释放的内存将被设置为例如零或任何其他值。 数组中的值可能会发生变化。 这可能是典型的行为。

但无论如何, 释放使用或访问此内存是不正确的代码,并调用未定义的行为。

内存已被释放,并已被提供给操作系统以执行其他任务。 但是如果操作系统不使用这个内存地址,那么该地址上的先前写入数据仍然存在。 您的程序输出可以随时给出不同的输出,即UNDEFINED行为。