Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2012, 22:32   #1
theYozh
Пользователь
 
Аватар для theYozh
 
Регистрация: 28.01.2009
Сообщений: 75
Хорошо Вставка объекта в map. Отрабатывают один конструктор и три деструктора

Всем привет. Столкнулся с непонятной ситуацией, прошу помочь разобраться.

Есть простейшая программа:
PHP код:
class {
public:
    
A()
    {
        
cout << "Constructed A" << endl;
    }
    ~
A()
    {
        
cout << "Destructed A" << endl;
    }
};

int main()
{
    
map<intAm;

    
m.insert(pair<intA>(1,A()));
    
    
getch();
    return 
0;

В консоль выводит следующее:
Код:
Constructed A
Destructed A
Destructed A
Destructed A
Не могу понять, почему три раза отрабатывает деструктор объекта, когда фактически объект создавался лишь один раз?
Надеюсь на вашу помощь
theYozh вне форума Ответить с цитированием
Старый 02.12.2012, 22:54   #2
theYozh
Пользователь
 
Аватар для theYozh
 
Регистрация: 28.01.2009
Сообщений: 75
По умолчанию

Похоже, что причиной всего являются тонкости работы insert и pair. На самом деле создается еще один объект, это легко заметить, тк после getch() в консоль падает еще одно сообщение "Destructed A".

После нескольких минут раздумий над столь парадоксальной на первый взгляд ситуацией ответ был найден : один раз отрабатывает конструктор по умолчанию, и три раза работает конструктор копирования (это происходит пока объект "гуляет" по insert, pair и еще чему-то - создаются локальные копии объекта). Потом каждый в свое время уничтожается. В итоге имеем четыре вызова деструктора. Вот и всё.
theYozh вне форума Ответить с цитированием
Старый 02.12.2012, 22:54   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Конструкторы бывают и другие. Учитывая 11ый стандарт, есть еще два:
Код:
A (const A &);
A (A &&); // этот из нового стандарта
Опишите первый (и, если необходимо, второй), и в сумме их должно быть три. Они вызываются из-за того, что объект, переданный Вами, еще не раз копируется где-нибудь.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 02.12.2012, 22:55   #4
theYozh
Пользователь
 
Аватар для theYozh
 
Регистрация: 28.01.2009
Сообщений: 75
По умолчанию

Granus, опередил Вас на долю секунды)

А вообще такой ситуации легко избежать храня в map указатели на объекты, это особенно важно если в классе есть статические поля.

Последний раз редактировалось theYozh; 02.12.2012 в 22:57.
theYozh вне форума Ответить с цитированием
Старый 03.12.2012, 00:11   #5
_Bers
Старожил
 
Регистрация: 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 стандарт
_Bers вне форума Ответить с цитированием
Старый 03.12.2012, 00:15   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от theYozh Посмотреть сообщение
Granus, опередил Вас на долю секунды)

А вообще такой ситуации легко избежать храня в map указатели на объекты, это особенно важно если в классе есть статические поля.
какое отношение к сабжу имеют статические поля?
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ни один конструктор не смог принять исходный тип. 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