Форум программистов, компьютерный форум CyberForum.ru

Непонятный вызов Деструкторов при создании списка - C++

Восстановить пароль Регистрация
 
 
UACrimea
4 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 6
19.02.2013, 19:07     Непонятный вызов Деструкторов при создании списка #1
Непонятный вызов Деструкторов при создании списка.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <list>
#include <vector>
#include <string>
using namespace std;
 
class AAA
{
    friend ostream &operator<<(ostream &, const AAA &);
   public:
      double x;
 
      AAA(double _x)
      {
          cout << "Vizvan Konstructor\n";
          x=_x;
      }
      
      ~AAA()
      {
         cout << "Vizvan Destructor\n";
      };
};
 
ostream &operator<<(ostream &output, const AAA &aaa)
{
   output << aaa.x << ' ' << endl;
   return output;
}
 
int main()
{
   list<AAA> L;
   L.push_back(AAA(3));
   cout<<"\n";
   L.push_back(AAA(7));
   cout<<"\n";
   L.push_back(AAA(9));
   cout<<"\n";
  
   list<AAA>::iterator i;
   for(i=L.begin(); i != L.end(); ++i) 
      cout << *i; // print with overloaded operator
   
   return 0;
}
Результат работы программы:
Vizvan Konstructor
Vizvan Destructor

Vizvan Konstructor
Vizvan Destructor
Vizvan Destructor

Vizvan Konstructor
Vizvan Destructor
Vizvan Destructor
Vizvan Destructor

3
7
9
Vizvan Destructor
Vizvan Destructor
Vizvan Destructor
Vizvan Destructor

Не пойму почему деструкторы так вызываются!
Если организовать добавление объектов в список иначе, тогда понятно как вызвываются конструктор и деструкторы!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <list>
using namespace std;
 
 
class AAA
{
   public:
      double x;
 
      AAA(double _x)
      {
          cout << "Vizvan Konstructor\n";
          x=_x;
      }
      
      ~AAA()
      {
         cout << "Vizvan Destructor\n";
      };
};
 
 
 
 
int main()
{
   list<AAA> L;
   AAA Ablob(2);
 
   Ablob.x=7;
   L.push_back(Ablob); 
 
   Ablob.x=5;
   L.push_back(Ablob);  
              
   Ablob.x=8;
   L.push_back(Ablob); 
 
   list<AAA>::iterator i;
 
   for(i=L.begin(); i != L.end(); ++i) 
       cout << (*i).x << " " << endl; 
 
   
 
   return 0;
}
Результат:
Vizvan Konstructor
7
5
8
Vizvan Destructor
Vizvan Destructor
Vizvan Destructor
Vizvan Destructor

Конструктор вызывается один раз потому, что мы создали один объект вне списка. 4-ре Деструктора вызываются по завершению проги(1-н к созданному отдельно объекту и 3-и к объектам скопированным в список).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
20.02.2013, 12:05     Непонятный вызов Деструкторов при создании списка #21
Цитата Сообщение от daslex Посмотреть сообщение
динамический массив расширить легко.
Заинтригован в особенности, словом "легко"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UACrimea
4 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 6
20.02.2013, 13:41  [ТС]     Непонятный вызов Деструкторов при создании списка #22
Тема хорошо разрослась!

Добавлено через 27 минут
Нашел книгу "Скотт Мейерс - Эффективное использование STL". Там описано про vector.
Еще обсуждение контейнеров: http://www.gamedev.ru/code/articles/?id=4228
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 12:51     Непонятный вызов Деструкторов при создании списка
Еще ссылки по теме:

Вложенные структуры. Ошибка с создании вложенного двунаправленного списка C++
C++ Вызов конструкторов/деструкторов при наследовании
C++ Ошибка в создании списка

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.02.2013, 12:51     Непонятный вызов Деструкторов при создании списка #23
Цитата Сообщение от daslex Посмотреть сообщение
динамический массив расширить легко
Чтобы "расширить" динамический, нужно создать массив нового, большего размера, скопировать туда данные из старого массива, а память под старый очистить. Итого один new, один цикл (про STL забудем, раз уж вектор не юзаем), один delete. Чтобы расширить вектор - нужно совершить один вызов метода.
Yandex
Объявления
25.02.2013, 12:51     Непонятный вызов Деструкторов при создании списка
Ответ Создать тему
Опции темы

Текущее время: 17:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru