![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| d06osipov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
Я использую placement new, например так:
Вопрос: как теперь вызвать delete, чтобы потом можно было снова по этому адресу объект создать? И ещё. Верно ли, что placement new и delete гораздо более эффективны, чем обычные, потому что не надо искать свободное место в памяти? |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
| d06osipov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
1. А хорошо ли напрямую вызывать деструктор, нет ли более аккуратного способа?
Кроме того, помоему надо
2. Память я выделяю один раз обычным new. Правда ли, что потом placement new не делает ничего существенного, кроме вызова конструктора и инициализации локальных членов объекта (то есть время работы placement new несущественно больше времени работы конструктора и времени на инициализацию локальных членов). Это сообщение отредактировал(а) d06osipov - 21.12.2007, 11:45 |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
да правда, это бывает иногда необходимо, например для использования какого то блока памяти(выделенного заранее), или можно реализовать необычную стратегию управления памятью(хотя для этого обычно перегружают new delete) |
||||
|
|||||
| d06osipov |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
А такой вызов деструктора будет уничтожать локальные члены объекта *pt? Скажем, если pt->field объект некоторого класса, то вызов pt->~T() вызовет ли деструктор pt->field (как это происходит при обычном удалении)? |
||||
|
|||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
да, на то он и деструктор
|
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
d06osipov, так лцучше не писать. зачем тебе морока с char?
|
|||
|
||||
| d06osipov |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
Спасибо. Но всё-таки, вызов деструктора, есть нечто большее, чем вызов обычной функции, так? |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
при вызове delete происходит неявный вызов деструктора, а код деструктора выполняет удаление всех членов класса, для них то-же вызывается деструктор, и тд. В случае размещающего оператора new вызывать delete не нужно, но удалять память выделенную под члены класса все равно придется, поэтому нужно его вызвать напрямую. |
|||
|
||||
| d06osipov |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
Уверены, что именно код деструктора выполняет удаление всех членов, а не код delete? Добавлено через 13 минут и 50 секунд Всем спасибо, я убедился сам Вот программа:
Вывод (g++)
Замечание. B*b=operator new(sizeof(B)); не работает, потому что operator new возвращает void*. Я надеюсь, что это стандартный приём, и будет работать так на всех компиляторах. |
||||||
|
|||||||
| onsql |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 3.12.2007 Репутация: нет Всего: 3 |
А как в эту теорию впишется результат работы такого кода?
Вывод на экран, аналогичен твоему примеру. |
|||
|
||||
| d06osipov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
Хотя я не сторонник дедовских способов выделения памяти, в данном случае меня соверщенно не волнует этот процесс. placement new совершенно всё равно, каким именно образом выделена та память, куда будет размещён объект.
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Прекрасно вписывается. А что смущает? -------------------- ... |
|||
|
||||
| onsql |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 3.12.2007 Репутация: нет Всего: 3 |
Ну наверное я просто невнимательно прочитал. Просто я так понял, что вот эта фраза
относилось к тому, что в приведенному примере, именно благодаря вызову delete были вызваны деструкторы внутренних полей объекта b. На самом деле они были удалены в момент вызова
|
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Да, конечно. А деструктор был вызван благодаря delete
-------------------- ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |