在函数中创建的对象,它是保存在堆栈上还是堆上

object created in function, is it saved on stack or on heap?

本文关键字:保存 存在 堆栈 函数 创建 对象      更新时间:2023-10-16

我特别使用c++:当我在函数中创建一个对象时,这个对象会保存在堆栈上还是堆上?

我之所以这么问,是因为我需要保存一个指向对象的指针,而唯一可以创建对象的地方是函数中,所以如果我有一个指向该对象的指针并且方法完成了,指针可能会指向后面的垃圾。-->如果我向列表(它是类的一个成员)添加一个指向对象的指针,然后方法完成,我可能会让列表中的元素指向垃圾。

那么,当对象在方法中创建时,它是保存在堆栈上(函数结束后它将不相关)还是保存在堆上(因此我可以在不引起任何问题的情况下指向它…)?

示例:

class blah{ 
private:
    list<*blee> b;
public:
    void addBlee() {
        blee b;
        blee* bp = &b;
        list.push_front(bp);
    }
}

你可以忽略语法问题——以上只是为了理解概念和困境。。。

谢谢大家!

请记住以下几点:除非使用new operatormalloc变体在堆上显式分配,否则永远不会在堆中创建对象(在C++中更正确地称为"动态存储")。

其他一切要么是堆栈/寄存器(在C++中应该称为"自动存储"),要么是静态分配的变量。静态分配变量的一个例子是程序中的全局变量,这些变量是函数的本地变量,声明为静态或无类的静态数据成员。

你还需要非常清楚指针和对象本身之间的区别。在以下单行中:

void foo() {
    int* i = new int(42);
}

int是动态分配的(在堆上),而指向已分配int的指针有一个自动存储(堆栈或寄存器)。因此,一旦foo()退出,指针就会被擦除,但动态分配的对象仍然没有任何方法访问它。这被称为经典的内存泄漏

堆是通常进行动态内存分配的段,因此当您将内存显式分配给程序中的任何东西时,您都会从堆段中为其提供内存。

Obj yo = new Obj; //something like this.

堆栈是存储自动变量的另一个段,以及每次调用函数时保存的信息。

就像我们申报时一样:

*int* variable;

它将在堆栈上,其有效性仅在特定函数退出之前有效,而堆上的变量、对象等将保持在那里,直到main()结束。

void addBlee() {
    blee b;              // this is created on the stack
    blee* bp = &b;
    list.push_front(bp); // this is a pointer to that object
}  // after this brace b no longer exists, hence you have a dangling pointer

改为:

list.push_front(new blee);  // this is created on the heap and
                            // therefore it's lifetime is until you call
                            // delete on it`
相关文章: