可能是在C ++中被视为“正在堆栈”的堆上创建的对象?

时间:2011-12-19 07:14:26

标签: c++ stack memory-management heap

拥有代码:

struct FooBar
{
  FooBar()
  {
    MyObject obj;

    /// when c-tor is ended, obj must be deleted through d-tor call
  }
};
...
FooBar* fooBar(new FooBar);

fooBar在堆上分配。但MyObject obj的构造函数中的对象FooBar不知道它的创建位置。那么在MyObject的上下文中FooBar实例化是否可以像在堆栈中创建一样处理?

堆上分配的对象是否有自己的堆栈?这种堆栈的大小是多少?

2 个答案:

答案 0 :(得分:6)

obj在您的示例中的堆栈上分配(“普通”堆栈,调用new FooBar的代码中使用的“相同” - 假设您的环境有一个堆栈开始)。

this指向堆上某处的事实并没有改变构造函数是(相对)普通函数调用的事实,并且使用与其他函数相同的堆栈。

答案 1 :(得分:4)

C ++不了解堆栈或堆。它确实了解具有自动和动态存储持续时间的对象。在您的情况下,fooBar具有动态存储持续时间(因为它是使用new创建的)。它会一直存在,直到你打电话给deleteobj具有自动存储持续时间(因为它不是使用new创建的)。当封闭函数(FooBar - 构造函数)结束时,它的生命周期结束。