c++ - 关于内存管理、栈、堆的问题

标签 c++ memory memory-management

<分区>

Possible Duplicate:
Does this type of memory get allocated on the heap or the stack?

我有几个与内存相关的问题,希望你们能够回答。考虑这段代码,其中 Foo 代表一个具有大量方法和大量原始数据成员的大类:

class Foo {
  public:
    Foo() : // Initialize all data members ...
        { }

    // Lots of methods ...

    ~Foo() { /*Nothing needed here ... correct?*/ }

private:
    int    a;
    int    b;
    char   c;
    double d;
    // Lots of other primitive data members (no pointers) ...
};

class Bar {
  public:
    void func() {
        foo = new Foo();
    }

    // Assuming Bar::func() is always called before deletion ...
    ~Bar() { delete foo; }
  private:

    Foo* foo;
};

int main() {
    Bar bar;
    bar.func();

    Bar* barptr;
    barptr->func();

    return 0;
}

我的问题是,当我调用 bar.func() 时,Foo 的所有数据成员都分配在 stack 内存上还是在 内存上(我知道foo 会在堆上……我想!)?当我调用 barptr->func() 时会怎样?例如,Foo::a 是在堆栈上还是在堆上?

此外,我是否需要显式删除 Foo::~Foo() 中的任何内容? Foo 只有原始本地数据成员,并且没有任何函数使用 newmalloc()

在我完全不知道我在说什么的情况下,如果有人能解释这些数据的存储位置,我将不胜感激。

最佳答案

new 分配的所有东西都在堆上,包括它的所有成员。 foo = new Foo(); 行在堆上创建了一个 Foo(包括 所有 它的成员)。
只有命名对象在堆栈上。在您的情况下,bar(Bar)和 barptr(指向 Bar 的指针)。 Foo 的析构函数不需要做任何事情,这实际上很常见,如果您正确使用 RAII,就像 C++ 方式一样。

在您的main 函数中,bar 是堆栈上的一个Bar 区域,它分配了一个Foo 在堆上。如果 barptr; 被实际初始化,barptr 将是堆栈上的一个区域,它是指向某个地方的 Bar 的指针(也许堆栈也许不是) .但是,在任何情况下,Barfoo 成员都将分配到堆上,因为这是 Bar 的构造函数告诉它要做的。

在您的 main 函数中,bar 是堆栈上的一个区域,它是一个(指向(大基元集合)的指针),它分配一个(大集合基元)在堆上。
如果 barptr; 被实际初始化,barptr 将是堆栈上的一个区域,它是指向某处(指向(大量基元的指针))某处(可能是堆栈也许不会)。然而,在任何情况下,(大量原语集合)都将分配到堆上,因为这是构造函数告诉它要做的。

因为我知道有人会提到它,所以堆/栈的区别是编译器的心血来潮,并没有以任何方式标准化。如果愿意,它完全可以“作弊”并将东西放在其他地方。例如,全局对象通常既不在栈上也不在堆上,而是在另一个地方。此外,这就是 C# 和 java 运行如此之快的原因,尽管它经常(显然)使用内存管理。编译器经常“欺骗”并将“动态作用域”对象放在堆栈上。

关于c++ - 关于内存管理、栈、堆的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7603732/

相关文章:

c++ - 尝试将 std::aligned_storage 与 SSE 和新的一起使用

c - 使用链表时释放 C 中动态分配的内存

c++ - 迭代是否遍历整个列表

c++ - 在不引入包装器的情况下打印对

ios - 在应用程序运行时检查内存使用情况

c - 奇怪的未知 malloc 错误

memory-management - CGO:如何使用 malloc 从 go 中释放在 C 中分配的内存以避免内存泄漏

c++ - 如何存储通用引用

c++ - 使用相同的 unique_ptr 执行 std::move 两次

php - 如何存储每秒数百个用户可以访问的 PHP 变量?