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または aを実行しても、解放されたメモリがゼロやその他の値に設定されることは保証されdelete ません。配列内の値は変更されない場合があります。これはおそらく典型的な動作です。

ただし、メモリを解放した後にこのメモリを使用またはアクセスすると、コードが正しくなく、未定義の動作が発生します。

于 2012-08-20T07:38:59.577 に答える
0

メモリは解放され、他のタスクのために OS に渡されます。ただし、その間に OS がこのメモリ アドレスを使用しない場合、そのアドレスに以前に書き込まれたデータはまだそこにあります。プログラムの出力は、いつでも異なる出力、別名 UNDEFINED の動作を与える可能性があります。

于 2012-08-20T07:43:43.080 に答える