我是C ++的初学程序员,对变量有疑问。
例如,如果我有这种方法:
int wow()
{
int x = 99;
return 0;
}
当此方法退出(返回0)时,它是否会破坏变量x?
这个变量是存储在堆栈还是堆中?
我知道你可以做int * x = new int(99),然后它会在堆中。
但没有*,它是否在堆栈内?
在上面的方法中,当它退出时,x被破坏了吗?
答案 0 :(得分:5)
当此方法退出(返回0)时,它是否会破坏变量x?
是。 x
具有自动存储持续时间,并在超出范围时被销毁 - 在这种情况下,当函数返回时。
这个变量是存储在堆栈还是堆中?
在堆栈上。
我知道你可以做
int *x = new int(99)
,然后它会在堆中。
实际上; new
创建的对象具有动态存储持续时间,并且位于堆上。请注意,还有第二个对象x
,指向堆上对象的指针。 x
本身是堆栈中的自动对象。 (讽刺的是,C ++将动态内存的来源称为“免费商店”,而不是“堆”)。
但没有
*
,它是否在堆栈内?
没有*
,那就不会编译。 new
在从堆中取出的内存中创建一个对象,并给出它的地址。 *
表示x
是指针,因此可以保存该地址。没有它,它将是int
并且无法保存地址。
在上面的方法中,当它退出时,x被破坏了吗?
指针x
是;但它指出的对象不是。动态对象(使用new
创建)持续到使用delete
显式销毁它们。如果这种情况从未发生过,那么你就会发生内存泄漏 - 已分配内存但从未发布。
除非你确实需要,否则请避免动态分配;当你这样做时,总是使用智能指针,容器等来安全地管理它,并避免使用new
和处理原始指针。
答案 1 :(得分:1)
int x = 99;
在堆栈上声明一个变量。
它被摧毁了#34;当函数返回时,内存被释放以供其他函数使用,但通常没有明确的擦除。
为了更明确地了解 destroy ,这意味着下次我们查看该内存位置时,我们无法可靠地期望相同的值存在。但是,由于没有明确的覆盖,下次我们查看内存位置时有可能会出现这种情况。
在声明中使用时澄清*
符号。
int *ptr
声明一个指向整数的指针,但是这个指针可以指向堆栈或堆,具体取决于你决定指向它的位置。
堆:
int* ptr = new int(100);
int* ptr2 = ptr; // Now you have two pointers to the same location in the heap
堆叠
int stackMe = 100;
int* ptrToStack = &stackMe; // Point ptrToStack at an `int` on the stack.
在任何一种情况下,您都可以通过指针修改值。
*ptr = 5; // set the `int` that ptr points to, to 5.
答案 2 :(得分:1)
在您的情况下,x
通常会保存在处理器寄存器中,而不会占用任何内存(使用优化编译器)。如果编译器需要释放寄存器,它会将变量溢出到堆栈。
编译器永远不会自动在堆上放置对象。