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

时间:2012-08-20 07:37:14

标签: c++ c pointers dynamic-memory-allocation

  

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

4 个答案:

答案 0 :(得分:5)

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

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

这使得释放内存更快。

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

答案 1 :(得分:2)

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

并且毫无疑问,当您访问已发布的内存时, 会遇到未定义的行为。就这么简单。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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