Вектор push_back вызывает деструктор объекта - PullRequest
0 голосов
/ 10 февраля 2019

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

Допустим, у меня есть:

1) Два класса (ACLass и BClass)

2) AClass имеет конструктор и деструктор

3) BClass имеет член std :: vector, который хранит объекты AClass

4) Количество элементов в этом векторе равноUNKNOWN заранее

5) Каждый раз, когда вызывается метод BClass generateObject (), вектор расширяется при создании нового объекта AClass.Это делается с помощью вызова std :: vector.push_back ().

class AClass {
    AClass()  { //Constructor }
    ~AClass() { //Destructor }
};

Class BClass {
    std::vector<AClass> object;

    void generateObject() {
        object.push_back(AClass());
    }
};

Теперь, в приведенном выше примере, generateObject () будет работать только пару раз.Как только вектор становится слишком маленьким, чтобы содержать все объекты, он выполняет различные внутренние операции, чтобы зарезервировать больше памяти для возможности расширения.Проблема состоит в том, что некоторые из (если не все) деструкторов AClass вызываются во время процесса.

Поскольку число элементов неизвестно, резервирование большего пространства для вектора с помощью reserve () не является опцией.Использование emplace_back () также не решило мою проблему.

Так как мне поступить?Есть ли способ предотвратить вызов деструкторов?Является ли использование std :: vector в этом случае хорошей идеей?

1 Ответ

0 голосов
/ 10 февраля 2019

Когда std::vector расширяет свое хранилище, оно копирует или перемещает текущие объекты в новое хранилище.Старые объекты выбрасываются, и это по своей природе подразумевает вызов деструкторов для старых объектов.

Если уничтожение старых объектов нежелательно, std::deque выполняет более или менее те же операции, что иstd::vector, с несколько большими накладными расходами, но без перераспределения хранилища.

Если использование памяти не является проблемой, std::list никогда не перемещает свои сохраненные объекты, но каждый элемент вВ списке также есть пара указателей, один из которых указывает на предыдущий элемент в списке, а другой - на следующий элемент.

...