Как я могу добавить больше объектов класса в вектор без динамического выделения памяти? - PullRequest
0 голосов
/ 07 января 2011
class AClass
{
    // ...
}

~

class AnotherClass
{
    public:
        // ...
        void AMethod()
        {
            // ...
            AClass * ac = new AClass(); // Dynamic memory allocation here
            m_Objects.push_back(ac);
            // ...
        }
        // ...
    private:
        // ...
        std::vector<AClass *> m_Objects;
        // ...
}

Я хочу добавить новые объекты AClass в вектор m_Objects.
Есть ли другой способ сделать это без динамического выделения памяти?

Ответы [ 4 ]

4 голосов
/ 07 января 2011

Здесь есть две вещи, вызывающие динамическое выделение памяти:

  1. vector::push_back
  2. new AClass()

Вот одна идея, как сократить динамическое распределение памяти.

Первый шаг - вызвать m_Objects.reserve(N); в конструкторе AnotherClass, где N - максимальное количество AClass объектов, которые вы хотите сохранить в любой момент времени. Это резервирует достаточно памяти для устранения необходимости динамического распределения на vector::push_back.

Второй шаг состоит в том, чтобы m_Objects содержал объекты вместо указателей, то есть, чтобы он был напечатан std::vector<AClass> вместо std::vector<AClass*>. Это позволяет вам пропустить new и напрямую создать новый объект, увеличив контейнер:

m_Objects.resize(m_Objects.size() + 1);

Теперь при добавлении нового объекта не будет динамического размещения.

2 голосов
/ 07 января 2011

Если вы имеете в виду «могу ли я создавать новые объекты во время выполнения без динамического выделения?» тогда ответ - нет. Вот что такое динамическое распределение.

Если вы хотите создать некоторые из них раньше, чем они будут немедленно необходимы, создав их заранее, тогда это вполне вероятно. Просто выделите большое число, а затем вытяните их из массива или вектора при необходимости.

1 голос
/ 07 января 2011

Существует только два способа размещения объектов во время выполнения: динамически в куче и в стеке вызовов.

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

Это означает, что единственный другой способ - использовать new для динамического создания новых объектов.

1 голос
/ 07 января 2011

Не так долго, пока m_Objects является vector из указателей , если только вы не должны хранить указатель на автоматическую (стековую) переменную. Но это, несомненно, было бы очень плохой идеей.

...