|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.12.2012, 22:32 | #1 |
Пользователь
Регистрация: 28.01.2009
Сообщений: 75
|
Вставка объекта в map. Отрабатывают один конструктор и три деструктора
Всем привет. Столкнулся с непонятной ситуацией, прошу помочь разобраться.
Есть простейшая программа: PHP код:
Код:
Надеюсь на вашу помощь |
02.12.2012, 22:54 | #2 |
Пользователь
Регистрация: 28.01.2009
Сообщений: 75
|
Похоже, что причиной всего являются тонкости работы insert и pair. На самом деле создается еще один объект, это легко заметить, тк после getch() в консоль падает еще одно сообщение "Destructed A".
После нескольких минут раздумий над столь парадоксальной на первый взгляд ситуацией ответ был найден : один раз отрабатывает конструктор по умолчанию, и три раза работает конструктор копирования (это происходит пока объект "гуляет" по insert, pair и еще чему-то - создаются локальные копии объекта). Потом каждый в свое время уничтожается. В итоге имеем четыре вызова деструктора. Вот и всё. |
02.12.2012, 22:54 | #3 |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
Конструкторы бывают и другие. Учитывая 11ый стандарт, есть еще два:
Код:
Форматируйте код, будьте людьми.
|
02.12.2012, 22:55 | #4 |
Пользователь
Регистрация: 28.01.2009
Сообщений: 75
|
Granus, опередил Вас на долю секунды)
А вообще такой ситуации легко избежать храня в map указатели на объекты, это особенно важно если в классе есть статические поля. Последний раз редактировалось theYozh; 02.12.2012 в 22:57. |
03.12.2012, 00:11 | #5 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
m.insert(pair<int, A>(1,A()));
pair<int, A>(1,A()) создает временный объект. A() создает временный объект. Итого: 2 диструктора временных объектов, и ещё 1 по завершении приложения, когда оканчивается срок жизни map<int, A> m; 2003 стандарт |
03.12.2012, 00:15 | #6 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ни один конструктор не смог принять исходный тип. c++ | Neolit1819 | Помощь студентам | 3 | 30.03.2011 23:37 |
Вставка пары в отсортированный map. | the_deer_one | Общие вопросы C/C++ | 3 | 28.08.2010 15:42 |
Как прописать три разных состояния объекта? | Timon779 | Помощь студентам | 0 | 11.06.2010 20:32 |
Оптимизируем return объекта; конструктор копирования | Kn793 | Общие вопросы C/C++ | 2 | 24.04.2010 20:26 |
CSS вёрстка, вставка Google map поверх изображения, фона! | sting | HTML и CSS | 0 | 09.02.2010 22:27 |