记忆问题,新的和免费的等等.(C++)

shu*_*uwo 4 c++ memory free new-operator

关于C++中的内存处理,我有几个问题.

  1. 有什么不同Mystruct *s = new MystructMystruct s?记忆中会发生什么?

  2. 看看这段代码:

    struct MyStruct{
        int i;
        float f;
    };
    
    MyStruct *create(){
        MyStruct tmp;
        tmp.i = 1337;
        tmp.j = .5f;
        return &tmp;
    }
    
    int main(){
        MyStruct *s = create();
        cout << s->i;
    
        return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)

什么时候免费MyStruct tmp?为什么最后没有MyStruct tmp自动免费create()

谢谢!

Sap*_*pph 8

当您使用new关键字获取指针时,您的结构将在堆上分配,以确保它将在应用程序的生命周期内持续存在(或直到它被删除).

如果不这样做,结构将在堆栈上分配,并在分配的范围终止时销毁.

我对你的例子的理解(如果我错了,请不要犹豫,告诉我,任何人):

tmp确实会在函数末尾"释放"(不是堆栈变量的最佳单词选择),因为它是在堆栈上分配的,并且堆栈帧已经丢失.你返回的指针/内存地址不再具有任何意义,如果代码有效,你基本上只是幸运(没有任何东西覆盖旧数据).