2013-05-08 4 views
0
std::vector<Object *> pVector; 

, когда из области видимости, массив/вектор указателей может удалить каждый элемент указателя автоматически? или должен удалить каждый объект вручную?- массив/вектор указателей может удалить указатель auto?

Так что если я могу думать, что: если вектор/массив не содержит указателей, он автоматически вызовет деконструктор? но если сохраненные указатели, они должны удалять элементы вручную?

ответ

2

vector правильно уничтожает объекты, хранящиеся IN вектор. Будет вызван деструктор. Если у вас есть вектор указателей, то это означает собственный деструктор указателя (а не то, на что он указывает).

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

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

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

0

Нет, vector будут удалены только память, которую он держит, которая памяти для хранения указателей - эффективно, это будет массив некоторого размера, таких как:

Object **array = new Object*[size]; 

Когда вызывается деструктор , все, что будет удален этот массив магазин:

delete[] array; 

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

0

Когда уничтожается std :: vector, он вызывает деструктор Object *, а не Object, поэтому уничтожается только указатель на память.

Вы должны использовать либо интеллектуальные указатели (std::shared_ptr<Object> or std::unique_ptr<Object>), либо boost::ptr_vector<Object>, которые будут управлять памятью для вас.

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