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

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

我所要求的理由是因为我需要保存一个指向对象的指针,并且唯一可以创建的对象位于函数内,所以如果我有一个指向该对象的指针并且方法结束,指针可能指向垃圾后。 - >如果我将一个指向对象的指针添加到列表(这是类的成员),然后方法结束,我可能会让列表中的元素指向垃圾。

所以再次 - 当方法中创建对象时,它会保存在堆栈中(在函数结束后它将不再相关)或保存在堆中(因此我可以指向它而不会导致任何问题)。 ?

例:

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

你可以忽略语法问题 - 以上只是为了理解这个概念和困境......

谢谢大家!


请记住以下事项:除非在堆上使用new operatormalloc变体明确分配,否则该对象从不在堆中创建(在C ++中更正确地称为“动态存储”)。

其他一切都是堆栈/寄存器(在C ++中应该称为“自动存储”)或静态分配的变量。 静态分配变量的一个例子是程序中的全局变量,声明为static的静态或静态数据成员的函数局部变量。

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

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`
链接地址: http://www.djcxy.com/p/13871.html

上一篇: object created in function, is it saved on stack or on heap?

下一篇: Understanding Stack, Heap and Memory Management