-2

Free() は解放するメモリのバイト数を知っていますが、delete[] で同じことができますか? ヒープではなくスタックから割り当てる場合、 free() と delete[] で問題なく動作しますか? 最後の質問: 最後に NULL を代入する必要がありますか?

#include <stdio.h>
#include <stdlib.h>

char * malloc2()
{
    char * m = (char *)malloc(100);
    //so malloc(10000000) cannot cause stack-overflow?
    //cast from void * to char *
    return m;
}

char * malloc3()
{
    static char m[100];
    //can [1000000] cause stack overflow?
    return m;
}

char * newX()
{
    char * output = new char[100];
    return output;
}

int main(){

    char * p = malloc2();
    //sizeof(p) gives 8 because this is on 64 bit OS/CPU
    free(p);
    //free() knows the size of p is 100.
    //Does it matter if this allocation from stack of malloc2()?
    p=NULL;

    char * q = malloc3();
    //again, sizeof(q) fives 8
    //is this allocation from stack of malloc3()?
    //I dont need to free because that was from an array declaration ?
    q=NULL;
    //then who  deletes that static array from the stack?


    char * r = malloc3();
    //now r and q point to same memory area ? 
    // then if I free q, I dont need to free r.
    r=NULL;

    char * s = newX();
    //allocation from stack again?
    //sizeof(s) gives 8, how can delete[] know its size?
    delete [] s;
    s=NULL;

    return 0;
}

ありがとうございました。

4

3 に答える 3

16

スタックに割り当てられたメモリでも動作しませんfreedeletedelete []

ルールは実際にはとてつもなく単純です。

  • everymallocは正確に one とペアにする必要がありfree、その逆も同様です。1
  • everynewは正確に one とペアにする必要がありdelete、その逆も同様です。
  • everynew []は正確に one とペアにする必要がありdelete []、その逆も同様です。

終わり。


1はい、嘘をつきました。malloc/とfreeもあるので難しいです。修正されたルールは次のとおりです。callocrealloc

  • すべてのmallocorは、 orcallocの 1 回の呼び出しとペアにする必要があります。freerealloc
  • reallocメモリを解放しないすべてのものは、freeまたはへの 1 回の呼び出しとペアにする必要がありますrealloc
  • (逆: Everyは、 、またはfreeに対して行われた 1 つの呼び出しに属していなければなりません。)malloccallocrealloc

つまり、(メモリ割り当てのため) のcallocように動作します。は→チェーンの包括的な中間リンクです。 と の両方を置き換えることができ、そのような呼び出しの間に配置できます。mallocreallocmallocfreemallocfree

于 2013-07-12T14:29:47.750 に答える
1

最後の質問に答えると、ポインター変数に NULL を格納する必要があるのは、設計でそれが必要な場合のみです。ポインターが何も指していないことを示すために使用されます。p関数の最後で消えるので、ここでそれを行うのは時間の無駄です:

void f() {
    char *p = new char[10];
    delete [] p;
    p = NULL;
}
于 2013-07-12T14:38:15.187 に答える
1

スタック変数を解放したり削除したりしないでください。スタック フレームが戻ると、それらは自動的に破棄されます。new で割り当てられたものだけを削除し、malloc() ファミリーによって割り当てられた free() のものだけを削除できます。

于 2013-07-12T14:30:44.120 に答える