繁体   English   中英

C ++内存管理-堆栈和堆

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM