Organization of a c++ program in memory - stack and heap
我正在学习C++,想知道这样的程序是如何在主内存中组织的。我知道有一个堆栈(带有stackframes)和一个堆。我知道动态分配的东西会在堆上分配它。这是由像
程序由一个主类和一个名为
- 一个构造函数
- 一个成员变量(
int ) - 一个成员函数
主类将对象定义为MyClass,并定义指向该对象的指针。
那么-这些记忆是如何组织起来的?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <iostream> using namespace std; class MyClass { int i; public: MyClass(int n) { i = n; } int get_nmbr() { return this->i; } }; int main() { MyClass myClass(100), *p; cout << myClass.get_nmbr() << endl; p = &myClass; cout << p; return 0; } |
让我们一行一行地穿过这条线。
1 | int main() { |
一个新的函数从这一行开始,然后是一个新的范围。
1 | MyClass myClass(100), *p; |
这里发生了两件事。第一,变量
第二个变量
1 | cout << myClass.get_nmbr() << endl; |
调用本地
1 | p = &myClass; |
将
1 2 3 | cout << p; return 0; } |
打印出局部变量
您的所有代码都只与堆栈分配有关。这样做的结果是,当函数的作用域在执行时保持/关闭(例如函数返回)时,对象将自动"销毁"并释放内存。如果您从该函数返回了像
如果要在堆上分配对象,因此将其生命周期扩展到其声明的范围之外,则使用C++中的新运算符。在引擎盖下,
您可以将上面的示例扩展到如下内容:
1 2 3 4 5 6 7 8 9 10 | { MyClass stackObj(100); // Allocate an instance of MyClass on the function's stack frame MyClass *heapObj = new MyClass(100); // Allocate an instance of MyClass from the process heap. printf("stack = %p heap = %p ", stackObj, heapObj); // Scope closes, thus call the stackObj destructor, but no need to free stackObj memory as this is done automatically when the containing function returns. delete heapObj; // Call heapObj destructor and free the heap allocation. } |
注意:您可能想看看新的位置,也许在这个上下文中是自动指针和共享指针。
第一件事。在C++中,不应该使用EDCOX1×0。
在这个程序中,所有使用的内存都在堆栈上。让我们一次看一个:
1 | MyClass myClass(100); |
1 | MyClass *p; |
1 | cout << myClass.get_nmbr() << endl; |
1 | p = &myClass; |
这里,
1 | cout << p; |
输出
这个程序(有点)可视化自动变量的布局。
您在堆栈上创建了MyClass对象和指针P(声明为MyClass*)。所以。在MyClass对象中,作为MyClass对象的一部分,我也在堆栈上创建了数据成员。指针P存储在堆栈上,但您没有为P分配,而是将P分配给已存储在堆栈上的MyClass对象的地址。因此,这里没有堆分配,至少从您发布的程序段中没有。
在堆栈上分配
在现代C++中,使用智能指针(如SyrdY-PTR)代替原始指针被认为是安全的。要在堆上分配
1 2 3 4 5 6 7 | #include <memory> int main() { std::shared_ptr<MyClass> p (new MyClass (100)); // Two heap allocations: for reference counter and for MyClass. auto p2 = std::make_shared<MyClass> (101); // One heap allocation: reference counter and MyClass stored together. return 0; } |