приведет ли это к утечкам памяти?
Да, это приведет к утечке памяти. Каждый объект, выделенный с помощью 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++, так как это легко приводит к утечкам памяти или неопределенному поведению и отрицательно влияет на дизайн вашей программы с точки зрения надежности, удобочитаемости и качества. простота обслуживания.
person
Andy Prowl
schedule
27.03.2013