我的 C++ 变量位于堆栈还是堆上?

N A*_*N A 4 c++ heap-memory stack-memory

这是我关于堆栈溢出的第一个问题。如果这是一个“愚蠢”的问题,我很抱歉,但我目前正在学习 C++,并且我对某些事情感到有点困惑。据我了解,在下面的代码中,变量“myVariable”在堆上声明,但在堆栈上的构造函数中实例化。那么它“存在”在哪里——堆上还是栈上?

class MyClass{
    int _myVariable;
    MyClass(int i){
        _myVariable = i;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n G 6

成员变量根据类的实例化方式进行分配。

void example() {
  MyClass a{17}; // This allocates memory on stack
  MyClass *b = new MyClass(17); // This allocates memory on heap
}
Run Code Online (Sandbox Code Playgroud)


Rai*_*dex 5

“栈”和“堆”是实现细节。C++ 标准定义了Automatic StorageDynamic Storage。变量存储最常见的实现分别是栈和堆。

new操作符使一个对象存在于动态存储中:

MyClass* mc = new MyClass(14);。请注意我们现在需要如何使用指针来访问它。

通过自动存储,我们可以省略指针语义:

MyClass mc = MyClass(14); // constructs an object on the automatic storage

你已经猜到了,对象的生命周期是自动管理的。更准确地说,直到范围结束

对于动态分配的对象,您必须自己管理对象的生命周期。

有些情况下你不能使用自动存储:即多态性。

如果MyClass是多态的(这意味着它具有虚函数),则不能将其放入自动存储中,因为编译器需要知道对象的大小。由于使用多态性,所指向对象的大小可以在运行时更改,因此不可能在自动存储上创建它。

MyClass c = MyClass2(); //Object Slicing 
c.foo(); // calls MyClass::foo()

MyClass* cc = new MyClass2(); //No Object Slicing
cc->foo(); // calls MyClass2::foo();
Run Code Online (Sandbox Code Playgroud)

有一些辅助类可以免除清理内存的责任: unique_ptrshared_ptr(尽管后者很少使用)。