Может ли объект, созданный в куче, рассматриваться как «находящийся в стеке» в С++?

Есть код:

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 рассматриваться так, как будто он был создан в стеке?

Имеет ли объект, размещенный в куче, собственный стек? Каков размер такого стека?


person barankin    schedule 19.12.2011    source источник


Ответы (2)


obj выделяется в стеке в вашем примере ("обычный" стек, "тот же самый", который используется в коде, который вызывает new FooBar - при условии, что ваша среда имеет стек для начала).

Тот факт, что this указывает где-то в куче, не меняет того факта, что конструктор является (относительно) обычным вызовом функции и использует тот же стек, что и другие функции.

person Mat    schedule 19.12.2011
comment
Я правильно понял, что стек, в котором создается obj, и стек, в котором живет указатель на FooBar, совпадают? - person barankin; 19.12.2011
comment
Скорее всего да. (Но ничто из этого не гарантируется стандартом — стек и куча являются деталями реализации. Вам не следует беспокоиться об этих деталях.) - person Mat; 19.12.2011
comment
И только последний момент. Так что в таком случае, если MyObject, будучи размещенным внутри FooBar в куче, выделяет большой массив double size[1000000], вызовет ли это ошибку о недостаточном [стеке] памяти? - person barankin; 19.12.2011

С++ не знает о стеке или куче. Он знает об объектах с автоматическим и динамическим сроком хранения. В вашем случае fooBar имеет продолжительность динамического хранения (поскольку он создается с использованием new). Он будет жить до тех пор, пока вы не вызовете на нем delete. obj имеет автоматическую продолжительность хранения (поскольку не создается с помощью new). Его время жизни заканчивается, когда закрывающая функция (конструктор FooBar) завершается.

person Björn Pollex    schedule 19.12.2011