如果在堆栈或堆上完成分配,那对free()和delete []有用吗?

hus*_*sik -2 c c++ heap stack

Free()知道要释放多少字节的内存但可以删除[]做同样的事情?如果我们从堆栈而不是堆分配,它们是否可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Kon*_*lph 16

无论是free也不是delete,也delete []有堆栈分配的内存工作.

该规则实际上非常简单:

  • 每个malloc必须与一个完全配对,free反之亦然.1
  • 每个new必须与一个完全配对,delete反之亦然.
  • 每个new []必须与一个完全配对,delete []反之亦然.

结束.


1好吧,我骗了.malloc/ free是困难的,因为这里还有callocrealloc.这是修正后的规则:

  • 每个malloccalloc必须与一个free或多个电话配对realloc.
  • 每天realloc,做释放内存必须恰好与一个呼叫中进行配对freerealloc.
  • (反之亦然:每个人free必须完全属于一个电话malloc,calloc或者realloc.)

换句话说,calloc表现得像malloc(为了内存分配).realloc是一个包容中间连杆mallocfree链-它可以同时取代mallocfree,并且它可以被放置在这样的调用之间.

  • 我喜欢这个,但是`malloc()`规则有点过分简化了 - `calloc()`和(更具体地说)`realloc()`复杂的东西.显然,每个`calloc()`应该只与一个`free()`相关联,就像`malloc()`一样.但是两者都因"一个函数中的完整内存管理器"而复杂化,即`realloc()`._[...继续...]_ (2认同)
  • @KonradRudolph但你可以补充说规则是可交换的; 例如,每个"free"必须恰好对应一个"malloc".(我知道,这似乎很明显,但考虑到这个问题,最好是过于明确.) (2认同)