Правильное решение хранения объектов в памяти (составной шаблон) - PullRequest
0 голосов
/ 09 февраля 2011

У меня уже есть объект класса CCompositePrimitive в Main.cpp

int main()
{
    ...
    CCompositePrimitive DrawObjects;
    ...
}

Класс CCompositePrimitive имеет поле:

private:
 list<CDrawObject*> m_Objects;

и метод:

public:
 Add(...);


void CCompositePrimitive::Add() {
 Objects.push_back(new Rectangle(...))
}

На некоторых форумах меня спрашивают, что DrawObjects объект будет храниться в куче. Но я думаю еще. На мой взгляд, DrawObjects объект будет храниться в стеке. Как я могу сохранить память компьютера от переполнения стека (любые другие проблемы с памятью), если DrawObjects можно хранить в списке m_Objects; очень много объектов, которые также могут содержать объекты CCompositePrimitive (составной шаблон).

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

Зависит от того, как создается класс, в котором хранится CCompositePrimitive m_DrawOjects;.(Я предполагаю, что он хранится внутри класса из-за m_)
Если ваш класс создан в стеке, то m_DrawObjects тоже будет.Если ваш класс создан в куче, то будет m_DrawObjects.Но независимо от того, создается ли m_DrawObjects в куче или стеке, объекты внутри list<CDrawObject*> m_Objects; будут создаваться в куче, потому что так работает связанный список.

Редактировать : Согласно вашим изменениям и комментариям, в стеке, конечно же, создается DrawObjects.:) Но то, что я сказал об объектах внутри списка, остается в силе.

1 голос
/ 09 февраля 2011

Элементы, которые вы помещаете в любую коллекцию STL, распределяются динамически.Ваша основная проблема заключается в управлении временем жизни указателей в коллекции. Вектор

будет хранить указатели в непрерывном хранилище и, следовательно, будет использовать меньше накладных расходов на элемент, поскольку ему не нужны указатели на следующий и предыдущий узлы.

список более эффективен во время, когда вы вставляете или удаляете что-либо, кроме конца коллекции, и никогда не будет перегружен перераспределением, когда вы выходите за пределы емкости.использовать, если вы никогда не хотите накладных расходов на перераспределение, иметь большое количество объектов, которые не нуждаются в непрерывном хранении, а только вставляют и удаляют с концов: любой конец - но никогда не в середине.

Если выЕсли вы хотите управлять временем жизни самих указателей, вы можете использовать shared_ptr в качестве типа вашей коллекции.В этом тоже есть накладные расходы.boost предоставляет безопасные для типов указатели-коллекции, которые управляют памятью элементов в них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...