OOP 和堆/堆栈

OOP and heap/stack

本文关键字:堆栈 和堆 OOP      更新时间:2023-10-16

我有一个看起来像这样的类

class A
{
    int b;
    void B()
    {
        int c;
    } 
}

int main()
{
    A asdf;
    A fdsa = new A();
}

A类的ASDF和FDSA实例有什么区别?在这两种情况下,哪个进入堆栈,哪个进入堆?

类 A 中的 b 变量是一个全局变量,无论类是如何声明的,都应该在堆中获得一个空格,对吗?

函数 B 的副本是否也分配给堆并从那里执行?

asdf进入

堆栈,而fdsa进入堆。

首先,fdsa 应该是一个指针。

A a_on_stack; // Destroys when going out of scope
A* a_on_heap = new A(); // Need to call "delete a_on_head;" to remove from memory

希望这有帮助

在C++标准内存中没有堆栈位置。它们是实现细节。

A asdf;

它是一个自动对象,会自动分配和销毁。

A *fdsa = new A();

它是一个动态和非自动的对象,分配和销毁应该由您管理。


关于标准堆栈的唯一内容是"堆栈展开"。

为自动构造的对象调用析构函数的过程 在从 try 块到引发异常的点的路径上 被称为"堆栈放卷"。[§15.2/3]

假设fsda是声明为A*(即指针):

  • asdf.b在堆栈上。
  • fsda->b在堆上。
  • 每当你调用A::B() 时,c都会进入堆栈。