3

可能重复:
C++ 删除 - 它删除了我的对象但我仍然可以访问数据?

我正在尝试在 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

4 回答 4

5

因为释放/释放内存并不意味着取消或类似的事情。

释放内存(很可能)只会将那块内存标记为空闲,并且不会对它做任何其他事情,直到其他东西再次使用它。

这使得释放内存更快。

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

于 2012-08-20T07:39:45.163 回答
2

未定义的行为意味着任何事情都可能发生。包括看起来工作。

毫无疑问,当您访问已释放的内存时,您会遇到未定义的行为。就那么简单。

于 2012-08-20T07:38:39.940 回答
1

系统可以自由地用释放的内存做任何它想做的事情,包括什么都不做。执行 afree或 adelete 并不能保证释放的内存将被设置为零或任何其他值。数组中的值可能碰巧没有改变。这可能是典型的行为。

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

于 2012-08-20T07:38:59.577 回答
0

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

于 2012-08-20T07:43:43.080 回答