Dan*_*eim 2 c++ pointers object heap-memory stack-memory
我专门使用 C++:当我在函数中创建一个对象时,这个对象会保存在堆栈上还是堆上?
我问的原因是因为我需要保存一个指向对象的指针,并且可以创建该对象的唯一位置是在函数内,所以如果我有一个指向该对象的指针并且该方法完成,则该指针可能指向垃圾后。--> 如果我将指向对象的指针添加到列表(它是类的成员)然后方法完成,我可能会让列表中的元素指向垃圾。
所以再次 - 当在方法中创建对象时,它是保存在堆栈中(函数结束后它将无关紧要)还是保存在堆中(因此我可以指向它而不会引起任何问题..) ?
例子:
class blah{
private:
list<*blee> b;
public:
void addBlee() {
blee b;
blee* bp = &b;
list.push_front(bp);
}
}
Run Code Online (Sandbox Code Playgroud)
你可以忽略语法问题——以上只是为了理解概念和困境......
谢谢大家!
请记住以下几点:除非使用new operator或malloc变体在堆上显式分配,否则永远不会在堆中创建对象(在 C++ 中更正确地称为“动态存储”)。
其他一切都是堆栈/寄存器(在 C++ 中应该称为“自动存储”)或静态分配的变量。静态分配变量的一个例子是程序中的全局变量,函数的局部变量,它们被声明为类的静态或静态数据成员。
您还需要非常清楚地区分指针和对象本身。在以下单行中:
void foo() {
int* i = new int(42);
}
Run Code Online (Sandbox Code Playgroud)
int动态分配(在堆上),而指向分配的 int 的指针具有自动存储(堆栈或寄存器)。结果,一旦foo()退出,指针就会被清除,但动态分配的对象仍然没有任何访问它的方法。这称为经典内存泄漏。