2011-01-17 3 views
2

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

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

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

спасибо.

+0

Здесь [связанный ответ] (http://stackoverflow.com/questions/4260464/does-stdlistremove-method-call-destructor-of-each-removed-element/4261074#4261074). – fredoverflow

ответ

4

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

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

+0

Спасибо. Я отмечаю это как ответ, поскольку он дает лучшее объяснение. (пока все равно) –

1

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

1

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

+0

На самом деле это звучит так, как будто обычные указатели ванили именно то, что он хочет здесь. –

+0

@ T.E.D .: Да, я думаю, что прочитал вопрос назад. 8v) Тем не менее использование 'shared_ptr' может быть плохой идеей, если оно используется для всего, что использует объекты. –

+0

Ммм ... они выглядят интересными. Спасибо, что привлек мое внимание. –

1

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

Чтение вашего вопроса, похоже, именно то, что вы хотите, чтобы он делал, поэтому вы хороши.

1

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

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

0

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

Во-первых, прочитать: http://crazyeddiecpp.blogspot.com/2010/12/pet-peeve.html

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

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

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

Смежные вопросы