C ++ Указатели, объекты и т. Д. - PullRequest
0 голосов
/ 17 апреля 2010

Это может немного смущать, но ...

Допустим, у меня есть член векторного типа в классе, что-то вроде vector<Operator*> (в моем классе есть методы для возврата операторов из этого контейнера). Теперь допустим, что у меня в классе есть метод, который получает объект Operator op и вставляет его в вектор. Что я хочу знать: возникнут ли у меня какие-либо проблемы, вставив их непосредственно в вектор (push_back(&op))? Или я должен использовать конструктор копирования, чтобы создать новый оператор, а затем поместить этот новый в вектор (с push_back (новый оператор (op)))?

(Оператор - это класс, который я создал)

Ответы [ 2 ]

2 голосов
/ 17 апреля 2010

Использование & op дает вам только указатель на объект (который все еще находится в стеке), а не его копию. Таким образом, когда объект выходит из области видимости (и очищается), указатель в векторе становится недействительным и вызывает проблемы.

Лучше всего использовать конструктор копирования, как вы предложили выше.

1 голос
/ 17 апреля 2010

Хорошо, дай мне посмотреть, пойду ли я тому, что ты пытаешься сделать. У вас есть класс, который вы создали под названием Operator . У вас есть vector <Operator *>, и вы задаетесь вопросом, будут ли проблемы с этим.

Краткий ответ: да, это может быть. Речь идет о области действия вектора, потому что, когда он выходит из области видимости, память, выделенная в куче для всех тех объектов Operator, на которые у вас есть указатели в векторе, НЕ будет очищаться вектором. В неуправляемом языке, таком как c ++, если вы не используете специализированный класс, который заботится о вас, вы должны четко осознавать область видимости и возможные утечки памяти.

Вам необходимо задать себе два вопроса: «Кому принадлежат объекты Оператора?» и "Кто отвечает за очистку объектов Operator , которые были выделены в куче и на которые указывают указатели в векторе?"

Вы можете очистить эту память самостоятельно, когда деструктор вызывается для объекта, которому принадлежит вектор.

Я думаю, вы, возможно, захотите посмотреть на этот ТАК вопрос , который похож. Существуют и другие решения - например, использование классов повышения, которые могут быть лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...