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

Освобождение памяти, занятой вектором - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Учебник Структуры и алгоритмы обработки данных http://www.cyberforum.ru/cpp-beginners/thread348926.html
Добрый день... Посоветуйте пожалуйста какой нибудь электронный учебник по структурам и аглоритмам обработки данных где все понятным языком написанно... вот пример Полный справочник Шилдта по С С++
C++ Добавить символ '//' в строку Ребят, необходимо добавить символ // в массив char. Когда делаю так: const char сh = {"http://www.mail.ru" "http://www.yandex.ru" }; то компилятор, как вы понимаете, воспринимает это как комментарий и выдает ошибку. http://www.cyberforum.ru/cpp-beginners/thread348839.html
Переход на Visual C++ c Delphi C++
Здрасте всем!! В общем начинал я с турбо паскаля, потом перешел на Delphi в общем писал я для себя некоторые програмки и какие то мелкие базки данных на заказ конторкам очень редко. Теперь решил поиграться с портами USB СОМ и понял что там все через одно место. Надо изучать Visual C. В общем поставил я Visual C++ Pro. Скачал учебники разные. Там даже не совпадает создание проэктов. И...
C++ Увеличить размеры шрифтов в VS 6.0
У меня под 7кой x64 вот такая картинка в VS 6.0 в настройках шрифтов (см. прикреплённый файл), а лабораторные по с++ нужно сдавать с условием что они будут запускаться в VS 6.0. Что можно сделать чтобы выбор размера шрифтов под 7кой в этой версии VS работал корректно? Может кто пользуется этой версией VS в наше время и подскажет мне.
C++ Пользуясь рекуррентной формулой.... http://www.cyberforum.ru/cpp-beginners/thread348809.html
значения в списках рандом Добавлено через 21 минуту я в этом деле новичок слабо шарю, да и по специальности потом не особо надо будет. кто сможет напишите проги. P.S. списки отдельно Прикрепляйте файлы к сообщениям. Ну и вообще правила почитайте...
C++ задачка для зачета Движение закрашенного круга по синусоиде из левого нижнего угла экрана в правый верхний угол. подробнее

Показать сообщение отдельно
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 00:58     Освобождение памяти, занятой вектором
Union, вот мои эксперименты:

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include <vector>
#include <string>
#include <memory>
 
using namespace std;
 
int alloc_counter = 0;
int dealloc_counter = 0;
 
class CDummy
{
private:
    //char huge_data[ 8192 ];
 
public:
    CDummy(){};
    CDummy( const CDummy &d ){ };
 
    ~CDummy(){ cout << "~ "; };
};
 
namespace std
{
    template<>
    class allocator<CDummy>
    {
    public:
      typedef size_t     size_type;
      typedef ptrdiff_t  difference_type;
      typedef CDummy*       pointer;
      typedef const CDummy* const_pointer;
      typedef CDummy&       reference;
      typedef const CDummy& const_reference;
      typedef CDummy        value_type;
 
      template<typename _Tp1>
      struct rebind
      {
          typedef allocator<_Tp1> other;
      };
 
      pointer allocate( size_type sz, const void* = 0 )
      {
          cout << "\nALLOCATE " << sz << " ITEMS\n";
          alloc_counter++;
          return (CDummy*) operator new( sz * sizeof( CDummy ) );
      }
 
      void construct(pointer ptr, const reference val)
      {
          cout << "CONSTRUCT\n";
          new ( (void *) ptr ) CDummy( val );
      }
 
      void deallocate( pointer ptr, size_type sz )
      {
          cout << "\nDEALLOCATE " << sz << " ITEMS\n";
          dealloc_counter++;
          delete ptr;
      }
 
      void destroy( pointer ptr )
      {
          cout << "DESTROY\n";
          ptr->~CDummy();
      }
 
      size_type max_size() const
      {
          return size_t(-1) / sizeof( CDummy );
      }
 
    };
};
 
int main()
{
    {
        vector<CDummy> vec (0);
 
        string input;
        int n;
 
        for(;;)
        {
            cout << '>';
            cin >> input;
 
            if( input == "add")
            {
                cin >> n;
                vec.resize( vec.size() + n );
            }
            else if( input == "del" )
            {
                cin >> n;
                vec.resize( vec.size() - n );
            }
            else if( input == "size" )
                cout << vec.size() << '\n';
            else if( input == "memstat" )
                cout << "allocations: " << alloc_counter
                     << "; deallocations: " << dealloc_counter << '\n';
            else if( input == "quit" )
                break;
            else
                cout << "what?\n";
 
            cout << '\n';
        }
 
        vec.clear();
    } // vec тут уничтожается
 
    cout << "\n\nallocations: " << alloc_counter << "; deallocations: " << dealloc_counter << "\n\n\n";
 
    return 0;
}
На выводе каждый вызов деструктора обозначается символом тильды. Попробуйте ввести эту последовательность команд:

add 5
add 70
add 100
memstat
size
del 170
memstat
size
add 40
add 20
memstat

У меня (gcc 4.6) вектор выделяет память при расширении. При уменьшении количества элементов он вызывает деструкторы (кстати, обходя void destroy( pointer )), но память не отдаёт. После уничтожения самого объекта вектора (введите quit) он отдаст память, но там уже поздновато будет.
 
Текущее время: 10:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru