так что я хотел бы иметь vector<OtherClassName> theVector
как член BaseClass
мне интересно во многих отношениях, что я могу получить утечки памяти …
приведет ли это к утечкам памяти?
BaseClass::someFunction(){
OtherClassName * c = new OtherClassName();
theVector.push_back((*c));
}
Я новичок в C ++, учусь в Интернете.
приведет ли это к утечкам памяти?
да, это приведет к утечке памяти. Каждый объект выделен с 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 ++, потому что это легко приводит к утечкам памяти или неопределенному поведению и отрицательно влияет на дизайн вашей программы с точки зрения надежности, читабельности и простоты обслуживания.
Классы, которые динамически создают что-либо, должны иметь деструктор, который освобождает память при разрушении объекта. Если у вас его нет, у вас есть утечки памяти. Любая память, занятая новым оператором, должна иметь соответствующий оператор удаления, иначе у вас будет утечка памяти. Поскольку ваш класс написан сейчас, у него будут утечки памяти, так как вы никогда не освободите память снова. Ваш деструктор должен просто пройти через вектор и освободить память от каждого указателя, который он хранит.