Stack vs Heap C++

KWJ*_*104 20 c++ memory-management

我刚才有一个关于堆栈变量与堆变量如何工作的快速问题.据我了解,堆栈变量是函数返回后的变量,并且堆变量是持久的.但我真正感到困惑的是如何在函数内部分配堆变量:

int MyObject::addObject(const char* a){
    MyObject newObject(a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

说我有一个构造函数MyObjectnewObject(const char * a).然后在这个函数调用它时,返回之后新构造的newObjectget被删除了吗?如果是,那么如何在函数内分配到堆呢?如果没有,你如何在以后清理你的记忆?

此外,析构函数的作用究竟是什么?何时被称为?

Luc*_*ore 16

一种类的构造函数MyObjectMyObject(),没有newObject().在您的示例中,newObject是变量的名称,而不是构造函数.

要在函数内的堆上进行分配,需要调用new运算符:

int MyObject::addObject(const char* a){
    MyObject* newObject = new MyObject(a);
    //newObject is allocated on the heap

    //... Some more code...

    delete newObject;
    //you have to explicitly delete heap-allocated variables
    //if not, you get memory leaks
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你的代码:

MyObject newObject(a);
Run Code Online (Sandbox Code Playgroud)

创建一个自动存储(堆栈)MyObject调用newObject,直到它在结束时声明它的范围 - 即关闭}.

此外,析构函数的作用究竟是什么?何时被称为?

要清理内存,使用newnew[](或malloc)分配的类拥有.当对象超出自动对象的范围或显式调用delete动态对象时,它被调用.