удаление вектора указателей против объекта в c ++ - PullRequest
2 голосов
/ 17 января 2011

У меня есть вектор указателей на объект (у меня они есть в качестве указателей, потому что я буду сильно менять позиции, и я бы подумал, что было бы намного быстрее просто поменять указатель, чем поменять местамицелый объект.

В любом случае, мне в конечном итоге потребуется удалить вектор, но объекты, на которые он указывает, все еще должны быть действительными. Документация, кажется, говорит, что она вызовет деструктор для каждого объекта в вектореЭто имеет смысл, когда это массив объектов, но если массив представляет собой массив указателей на объекты, будут ли также удалены объекты, на которые указывают указатели, или мне нужно удалить их вручную?

Если они удаляются автоматически, единственный способ сохранить объекты вокруг (скажем, они использовались в другом векторе) - это фактически скопировать объекты в другое место, и указатели в векторе указывают на эти объекты (а не наоригиналы)?

Спасибо.

Ответы [ 6 ]

4 голосов
/ 17 января 2011

Вызов деструктора для указателя значения ничего не делает. (С другой стороны, вызов delete для значения указателя запускает деструктор для намеченного объекта, и освобождают память.)

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

1 голос
/ 17 января 2011

Неважно - вот причина ключевого слова delete. Если вы выходите из области видимости, то вызывается деструктор объекта. Если указатель выходит из области видимости, то это, как правило, утечка памяти. То же самое применимо и здесь, поэтому вам не нужно делать ничего особенного.

Они будут продолжать существовать.

1 голос
/ 17 января 2011

Это действительно разрушит любые объекты в контейнере.Тем не менее, поскольку все объекты в вашем контейнере являются указателями, они ничего не будут делать.

Читая ваш вопрос, это звучит так, как вы этого хотите, поэтому вы хороши.

1 голос
/ 17 января 2011

Вы можете использовать умные указатели в вашем векторе, такие как Boost shared_ptr .

1 голос
/ 17 января 2011

Если у вас есть вектор указателей, фактические объекты должны оставаться вокруг, если вы удалите (или очистите) вектор.

0 голосов
/ 17 января 2011

В любом случае, мне в конечном итоге потребуется удалить вектор, но объекты, на которые он указывает, все еще должны быть действительными.Документация, кажется, говорит, что она вызовет деструктор для каждого объекта в векторе.Это имеет смысл, когда это массив объектов, но если массив представляет собой массив указателей на объекты, будут ли также удалены объекты, на которые указывают указатели, или мне нужно удалить их вручную?

Сначала прочитайте это: http://crazyeddiecpp.blogspot.com/2010/12/pet-peeve.html

Теперь спросите себя, говорит ли документация, что вектор удаляет каждый объект, на который указывает каждый объект, который он содержит?

Если вы можете ответить на этот вопрос с помощью«Нет», тогда у вас это есть.

Если вы можете ответить на этот вопрос «Да» ... ну ... попробуйте другую документацию.

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