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

时间:2015-12-02 16:24:31

标签: c++ pointers object stack heap

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

我要问的原因是因为我需要保存指向对象的指针,并且可以在函数内创建对象的唯一位置,所以如果我有一个指向该对象的指针并且方法完成,则指针可能是之后指着垃圾。 - >如果我将一个指向该对象的指针添加到一个列表(该类的一个成员),然后该方法完成,我可能会让列表中的元素指向垃圾。

所以再一次 - 当在一个方法中创建对象时,它是保存在堆栈上(在函数结束后它将无关紧要)还是保存在堆上(因此我可以指向它而不会导致任何问题..)?

示例:

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

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

全部谢谢!

3 个答案:

答案 0 :(得分:4)

请记住以下事项:除非在堆中使用new operatormalloc变量在堆上显式分配,否则永远不会在堆中创建对象(在C ++中更准确地称为“动态存储”)。 p>

其他所有内容都是堆栈/寄存器(在C ++中应该称为“自动存储”)或静态分配的变量。静态分配变量的一个例子是程序中的全局变量,函数本地的变量,它们被声明为classess的静态或静态数据成员。

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

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

int是动态分配的(在堆上),而指向该分配的int的指针具有自动存储(堆栈或寄存器)。结果,一旦foo()退出,指针就会被删除,但动态分配的对象仍然无法访问它。这称为经典内存泄漏

答案 1 :(得分:2)

Heap是通常发生动态内存分配的段,因此当您明确地将内存分配给程序中的任何内容时,您已从堆段中为其提供内存。

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

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

就像我们宣布:

*int* variable;

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

答案 2 :(得分:1)

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`