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)
成员变量根据类的实例化方式进行分配。
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)
“栈”和“堆”是实现细节。C++ 标准定义了Automatic Storage和Dynamic 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_ptr和shared_ptr(尽管后者很少使用)。
| 归档时间: |
|
| 查看次数: |
1712 次 |
| 最近记录: |