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

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

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

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

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

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


person jujiyangasli    schedule 27.03.2013    source источник
comment
Если вы хотите изучить C++, вы можете прочитать хорошую книгу по C++. Изучение C++ по кусочкам из Интернета — медленный и подверженный ошибкам процесс.   -  person Blastfurnace    schedule 27.03.2013


Ответы (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++, так как это легко приводит к утечкам памяти или неопределенному поведению и отрицательно влияет на дизайн вашей программы с точки зрения надежности, удобочитаемости и качества. простота обслуживания.

person Andy Prowl    schedule 27.03.2013
comment
спасибо, это очень помогает .. то, как вы объясняете семантику значений и ссылочную семантику, действительно помогает мне .. :) - person jujiyangasli; 28.03.2013
comment
@jujiyangasli: Хорошо, я рад, что это помогло. Если вы обнаружите, что это отвечает на ваш вопрос, рассмотрите возможность пометить ответ как принятый (или любой другой ответ, который вы предпочитаете). И удачи в обучении ;-) - person Andy Prowl; 28.03.2013
comment
@sftrabbit: Это только благодаря чрезмерно щедрому ОП, который решил наградить меня наградой. Кроме того, кажется, в последнее время у тебя дела идут лучше, чем у меня ;) - person Andy Prowl; 28.03.2013

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

person Edward Goodson    schedule 27.03.2013