создание динамического объекта в векторе

так что я хотел бы иметь vector<OtherClassName> theVector как член BaseClass

мне интересно во многих отношениях, что я могу получить утечки памяти …

приведет ли это к утечкам памяти?

BaseClass::someFunction(){
OtherClassName * c = new OtherClassName();
theVector.push_back((*c));
}

Я новичок в C ++, учусь в Интернете.

2

Решение

приведет ли это к утечкам памяти?

да, это приведет к утечке памяти. Каждый объект выделен с new должен быть уничтожен с delete, Невыполнение этого требования приводит к утечке памяти.

В частности, то, что вы храните в своем векторе, это копия объекта, выделенного с new, Если вы хотите, чтобы ваш контейнер содержал объекты определенного класса, достаточно сделать:

BaseClass::someFunction()
{
OtherClassName c;
theVector.push_back(c);
}

Обратите внимание, что vectorкак и все контейнеры библиотеки C ++ Standard, имеет семантика значения: это означает, что то, что вы вставляете в вектор копия объекта, который вы передаете push_back(), Дальнейшие изменения исходных объектов не будут отражены состоянием объекта, содержащегося в векторе, и наоборот.

Если вы хотите, чтобы это произошло, т.е. если вам нужно семантика ссылок, Вы должны будете позволить своему вектору содержать (возможно, умный) указатели. Например:

#include <memory>

// theVector would be declared as:
// std::vector<std::shared_ptr<OtherClassName>> theVector;

BaseClass::someFunction()
{
std::shared_ptr<OtherClassName> pC = std::make_shared<OtherClassName>();
theVector.push_back(pC);
}

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

1

Другие решения

Классы, которые динамически создают что-либо, должны иметь деструктор, который освобождает память при разрушении объекта. Если у вас его нет, у вас есть утечки памяти. Любая память, занятая новым оператором, должна иметь соответствующий оператор удаления, иначе у вас будет утечка памяти. Поскольку ваш класс написан сейчас, у него будут утечки памяти, так как вы никогда не освободите память снова. Ваш деструктор должен просто пройти через вектор и освободить память от каждого указателя, который он хранит.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector