gpt4 book ai didi

c++ - 在函数中创建的对象,它是保存在堆栈中还是堆中?

转载 作者:搜寻专家 更新时间:2023-10-30 23:55:02 25 4
gpt4 key购买 nike

我专门使用 C++:当我在函数中创建一个对象时,这个对象是保存在栈上还是堆上?

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

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

例子:

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

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

谢谢大家!

最佳答案

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

其他所有内容要么是堆栈/寄存器(在 C++ 中应称为“自动存储”),要么是静态分配的变量。静态分配变量的一个示例是程序中的全局变量、声明为静态或类的静态数据成员的函数局部变量。

您还需要非常清楚地区分指针和对象本身。在以下单行中:

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

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

关于c++ - 在函数中创建的对象,它是保存在堆栈中还是堆中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34047781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com