Стек против кучи с классами - PullRequest
1 голос
/ 22 марта 2012

Скажем, у вас есть простой класс с некоторой структурой данных хранения (список, вектор, очередь и т. Д.)

class MyClass
{
public:
    std::list<OtherClass*> m_myList;
};

Теперь предположим, что мы выделяем этот класс в куче.

MyClass* pClass = new MyClass();

Теперь, когда мы добавим больше элементов в этот список, они будут в куче или в стеке? Пример:

OtherClass* pOtherClass = new OtherClass();
pClass->m_myList.push_front(pOtherClass);

Спасибо за помощь!

Ответы [ 4 ]

2 голосов
/ 22 марта 2012

Стандартные классы коллекции используют класс Allocator для выделения памяти для сохраняемых элементов.Распределитель по умолчанию будет размещать данные в бесплатном хранилище.Вы можете предоставить свое собственное, если хотите, и, я полагаю, если вы захотите достаточно сильно, вы можете выделить его в стеке, но вам придется проделать немало дополнительной работы, чтобы это произошло.

Обратите внимание, что вы не должны выделить сам объект в бесплатном хранилище, чтобы это произошло.На самом деле, ваша MyClass *pClass = new MyClass(); обычно плохая идея.Обычно вы просто хотите использовать MyClass Class; и покончить с этим.Это выделит место для самого объекта коллекции (обычно довольно маленького) в стеке, но пространство для того, что он хранит, все равно будет обычно поступать из свободного хранилища (опять же, через распределитель).Помимо прочего, это помогает автоматизировать управление памятью - когда объект коллекции выходит из области видимости, он будет уничтожен.Его деструктор уничтожит содержащиеся в нем объекты и освободит память (все автоматически).

2 голосов
/ 22 марта 2012

std::list сохраняет элементы в куче, поэтому не имеет значения, где находится ваш класс.

1 голос
/ 22 марта 2012

Простое правило: если вы выделяете новые OtherClass объекты с new, то они находятся в куче.new только выделяет память из кучи.(Исключение: если вы используете пользовательский распределитель, который является расширенной функцией C ++, они могут находиться в любой области памяти по вашему выбору.)

Ваш m_myList является экземпляром std::list, что происходиттакже храните свою внутреннюю информацию в куче (но это деталь реализации, и вам обычно не нужно беспокоиться об этом).

1 голос
/ 22 марта 2012

Распределитель по умолчанию для стандартных шаблонных классов, выделяемых в куче, несмотря ни на что. Таким образом, они будут в куче.

...