Создание динамического объекта в векторе
Так что я хотел бы иметь 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++, имеет семантику значений: это означает, что то, что вы вставляете в вектор, является копией объекта, который вы передаете 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
считается плохой практикой программирования в Modern C++, потому что она легко приводит к утечкам памяти или неопределенному поведению и отрицательно влияет на дизайн вашей программы с точки зрения надежности, читабельности и простоты обслуживания.
Классы, которые динамически создают что-либо, должны иметь деструктор, который освобождает память при разрушении объекта. Если у вас его нет, у вас есть утечки памяти. Любая память, занятая новым оператором, должна иметь соответствующий оператор удаления, иначе у вас будет утечка памяти. Поскольку ваш класс написан сейчас, у него будут утечки памяти, так как вы никогда не освободите память снова. Ваш деструктор должен просто пройти через вектор и освободить память от каждого указателя, который он хранит.