[英]C++ Memory Management - The stack and the heap
我是C ++的初学者,对变量有疑问。
例如,如果我有此方法:
int wow()
{
int x = 99;
return 0;
}
当此方法退出时(返回0),它是否破坏变量x?
并且此变量存储在堆栈还是堆中?
我知道例如你可以做int * x = new int(99),然后它将在堆中。
但是如果没有*,它是否在堆栈内部?
并且在上述方法中,x退出时会被销毁吗?
当此方法退出时(返回0),它是否破坏变量x?
是。 x
具有自动存储期限 ,并且在超出范围时被销毁-在这种情况下,函数返回时。
并且此变量存储在堆栈还是堆中?
在堆栈上。
我知道例如您可以做
int *x = new int(99)
,然后它将在堆中。
确实; 由new
创建的对象具有动态存储期限 ,并且在堆上。 请注意,还有第二个对象x
,它是堆上指向该对象的指针。 x
本身是堆栈上的一个自动对象。 (通常,C ++将动态内存的源称为“免费存储”,而不是“堆”)。
但是如果没有
*
,它是否在堆栈内部?
没有*
,将无法编译。 new
在从堆中获取的内存中创建一个对象,并提供其地址。 *
表示x
是一个指针,因此可以保存该地址。 没有它,它将是int
并且无法保存地址。
并且在上述方法中,x退出时会被销毁吗?
指针x
为; 但是它指向的对象却不是。 动态对象(使用new
创建)持续到用delete
显式销毁它们为止。 如果这从未发生,那么您将发生内存泄漏 -内存已分配但从未释放。
除非确实需要,否则避免动态分配。 并且在执行此操作时,请始终使用智能指针,容器等来安全地对其进行管理,并避免使用new
和复杂的原始指针。
int x = 99;
在堆栈上声明一个变量。
当函数返回以释放内存以供其他函数使用的意义时,它将“销毁”,但是通常没有显式擦除。
为了更清楚地了解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.
在您的情况下, x
通常将保存在处理器寄存器中,并且根本不会占用任何内存(使用优化的编译器)。 如果编译器需要释放寄存器,则会将变量溢出到堆栈中。
编译器永远不会自动将对象放在堆上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.