在函数中创建的对象,它是保存在堆栈上还是堆上
object created in function, is it saved on stack or on heap?
我特别使用c++:当我在函数中创建一个对象时,这个对象会保存在堆栈上还是堆上?
我之所以这么问,是因为我需要保存一个指向对象的指针,而唯一可以创建对象的地方是函数中,所以如果我有一个指向该对象的指针并且方法完成了,指针可能会指向后面的垃圾。-->如果我向列表(它是类的一个成员)添加一个指向对象的指针,然后方法完成,我可能会让列表中的元素指向垃圾。
那么,当对象在方法中创建时,它是保存在堆栈上(函数结束后它将不相关)还是保存在堆上(因此我可以在不引起任何问题的情况下指向它…)?
示例:
class blah{
private:
list<*blee> b;
public:
void addBlee() {
blee b;
blee* bp = &b;
list.push_front(bp);
}
}
你可以忽略语法问题——以上只是为了理解概念和困境。。。
谢谢大家!
请记住以下几点:除非使用new operator
或malloc
变体在堆上显式分配,否则永远不会在堆中创建对象(在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`
- C++模板来检查友元函数的存在
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 既然存在危险,为什么项目要使用-I include开关
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 我们可以访问一个不存在的联盟的成员吗
- C++:对不存在的命名空间使用命名空间指令
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- C++quit()函数中可能存在作用域问题
- C++擦除(如果存在)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 使用导入的图像保存在 QT 中的 QLabel 中,保存 GUI 的状态
- 阵列不能两次将相同的名称保存,当要添加新字符串时,程序应检查以查看该名称是否已经存在
- 方法,该方法调用所有基类的同名方法(如果存在),并将返回值保存到列表中
- 什么设计模式将数据部分保存在持久存储 (SQL) 中,部分保存在 RAM(内存)中
- 是否存在可用于保存任何枚举值的整型?
- 将对象指针保存在 STL 容器中是否比将对象本身保存更好
- 从控制台保存信息,然后重新打开时,信息仍然存在