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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 5.00
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
07.09.2011, 14:30     Освобождение памяти, занятой вектором #1
У меня задача требует чтобы у вектора было в резерве не более 100 элементов. При постоянном росте вектора понятно как это обеспечить, а вот как быть при уменьшении количества элементов? Я не в курсе последних стандартов, подскажите есть ли сейчас способы гарантированного освобождения памяти, занятой вектором, и вообще какие способы существуют?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2011, 14:30     Освобождение памяти, занятой вектором
Посмотрите здесь:

C++ Освобождение памяти
C++ Освобождение памяти
резервирование памяти/освобождение памяти для трехмерного массива C++
Освобождение памяти C++
C++ освобождение памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 19:44     Освобождение памяти, занятой вектором #21
Цитата Сообщение от grizlik78 Посмотреть сообщение
А если элементами вектора могут быть объекты?
- какие обекты? Преобразовали тип и делов ноль
структуры пожалусто
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
WIN32_FIND_DATA * CFexplDlg::GetFileList(CString sPath)
{
    int FILE_COUNT = 1;
    WIN32_FIND_DATA *pFILEDATA = (WIN32_FIND_DATA *)
        malloc((FILE_COUNT + 1)*sizeof(WIN32_FIND_DATA));
    HANDLE hFile = FindFirstFile(sPath + "\\*.*",&pFILEDATA[FILE_COUNT]);
    if (hFile!=INVALID_HANDLE_VALUE)
    {
        do
        {
            if
            (
            strlen(pFILEDATA[FILE_COUNT].cFileName) == 1
            &&
            strchr(pFILEDATA[FILE_COUNT].cFileName,'.') !=NULL
            )
            if(FindNextFile(hFile,&pFILEDATA[FILE_COUNT]) == 0)
                break;
            if
            (
            strlen(pFILEDATA[FILE_COUNT].cFileName) == 2   
            &&
            strstr(pFILEDATA[FILE_COUNT].cFileName,"..") !=NULL
            )
            if(FindNextFile(hFile,&pFILEDATA[FILE_COUNT]) == 0)
                break;
            FILE_COUNT++;
            pFILEDATA = (WIN32_FIND_DATA *)
                realloc((void *)pFILEDATA,sizeof(WIN32_FIND_DATA)*(FILE_COUNT + 1));
            if(pFILEDATA == NULL)
                break;
        }
        while (FindNextFile(hFile,&pFILEDATA[FILE_COUNT])!=0);
        FindClose(hFile);
    }
    strcpy(pFILEDATA[0].cFileName,sPath);
    pFILEDATA[0].dwReserved0 = FILE_COUNT - 1;
    return pFILEDATA;
}
интерфейсы - пожалусто
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ppRecorder = (IDiscRecorder **)malloc(sizeof(IDiscRecorder));
GetCDBurners(ppRecorder);
 
//
while(pEnumDiscRecorders->Next(1,&pDiscRecorder,&cFetched) == S_OK)
    {
        ppRecorder[nCount] = pDiscRecorder;
        if( (hRes = pDiscRecorder->GetBasePnPID(
                    &sPnPID))
                    == S_OK)
        AddComboExItem(m_comboEx1, CString(sPnPID), NULL);
        pDiscRecorder->GetPath(&sPnPID);
//      if((type = GetDriveType(CString(sPnPID))) & DRIVE_CDROM)
//          CDialog::SetWindowText(CString(sPnPID));
        ppRecorder = (IDiscRecorder **)realloc((void *)ppRecorder,(1 + nCount++)*sizeof(IDiscRecorder));
        
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
07.09.2011, 19:49     Освобождение памяти, занятой вектором #22
-=ЮрА=-, при malloc не вызывается конструктор (вызывать можно через placement new), при free не вызывается деструктор (можно правда напрямую вызвать ->~Type())
это как бэ не сильно удобно, да и вообще
IDiscRecorder есть структура, элементы которой указатели на функции, те пример мало для объектов пригоден
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
07.09.2011, 19:50     Освобождение памяти, занятой вектором #23
-=ЮрА=-, запустите этот код:

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
#include <iostream>
#include <stdlib.h>
 
class CDummy
{
    enum EStatus
    {
        INITIATED = 0, BAD = 1
    } status;
 
public:
    CDummy() : status(INITIATED){ std::cout << "CDummy();"; };
    ~CDummy(){ std::cout << "~CDummy();\n"; };
 
    EStatus get_status(){ return status; };
};
 
 
int main()
{
    CDummy * dummy1 = new CDummy();
    CDummy * dummy2 = (CDummy*)malloc( sizeof(CDummy) );
 
    std::cout << "\nDummy1 status = " << dummy1->get_status() <<
            "\nDummy2 status = " << dummy2->get_status() << '\n';
 
    delete dummy1;
    free( dummy2 );
 
    return 0;
}
Для dummy2 не вызывается ни конструктор, ни деструктор.

Добавлено через 19 секунд

Не по теме:

Опоздал...

-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 19:55     Освобождение памяти, занятой вектором #24
Цитата Сообщение от alex_x_x Посмотреть сообщение
IDiscRecorder есть структура
http://msdn.microsoft.com/en-us/libr...v=vs.85).aspx;)

С таким же успехом преобразуюю CListCtrl * pList = (CListrCtrl *)malloc(sizeof(CListCtrl));

alex_x_x, вы работали с imapi v1?У меня даже вышло подключить IDiscMasterProgressEvents (хотя это был огромооомный гемор - в нете кучи топиков что интерфейс не работает) и сделать полнофункциональный бёрнер, так что с имапи знаком не по наслышке...
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
07.09.2011, 20:01     Освобождение памяти, занятой вектором #25
-=ЮрА=-, я знаком с COM
для ++ интерфейс реализован как таблица виртуальных функций (v-table), но с си он имеет бинарную совместимость, так как фактически является структурой указателей на функции
в коме есть нечто вроде
C++
1
typedef struct interface
идея в том что
вы объявляете интерфейс
C++
1
2
3
4
5
6
interface IMyCOMInterface1
{
    virtual int method1();
    virtual int method2();
    virtual int method3();
}
и адрес структуры/интерфейса будет совпадать с таблицей виртуальных функций, чтото вроде
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 20:13     Освобождение памяти, занятой вектором #26
Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, запустите этот код:
talis

Вот код и скрин работы, предлагаю скомпилировать
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
#include <windows.h>
#include <stdio.h>
 
class SimpleClass
{
private :
    char sMSG[256];
public:
    SimpleClass(){sMSG[0] = '\0';}
    void InitMSG(){strcpy(sMSG,"I'm created\r\n");}
    void ShowMSG(){printf("%s\r\n",sMSG);}
};
 
int main()
{
    SimpleClass * ptr = (SimpleClass *)malloc(sizeof(SimpleClass));
    printf("Enter num of exemlars : ");
    unsigned long n;scanf("%u",&n);
    ptr = (SimpleClass *)realloc((void *)ptr,n*sizeof(SimpleClass));
    for(unsigned long i = 0;i < n; i++)
    {
        ptr[i].InitMSG();
        ptr[i].ShowMSG();
    }
    system("pause");
    return 0;
}
Миниатюры
Освобождение памяти, занятой вектором  
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 20:16     Освобождение памяти, занятой вектором #27
PS:Создал массив объектов (классов) посредством malloc и realloc, думаю все вопроссы должны отпасть сами собой..!

Добавлено через 1 минуту
Цитата Сообщение от talis Посмотреть сообщение
CDummy() : status(INITIATED){ std::cout << "CDummy();"; };
- предлагаю обратить внимание как выполнен конструктор в моём классе
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
SimpleClass(){sMSG[0] = '\0';}
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
07.09.2011, 20:17     Освобождение памяти, занятой вектором #28
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вот код и скрин работы
Ужасно. Вернее не так: Ужас-ужас.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
07.09.2011, 20:20     Освобождение памяти, занятой вектором #29
-=ЮрА=-, во-первых это подмена понятий, во-вторых
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
class SimpleClass
{
private :
        char sMSG[256];
        std::vector<int> v;
public:
        SimpleClass(){sMSG[0] = '\0';}
        void InitMSG(){strcpy(sMSG,"I'm created\r\n");}
        void ShowMSG(){printf("%s\n",sMSG); v.push_back(0);}
};
 
int main()
{
        SimpleClass * ptr = (SimpleClass *)malloc(sizeof(SimpleClass));
        printf("Enter num of exemlars : ");
        unsigned long n = 5;
        ptr = (SimpleClass *)realloc((void *)ptr,n*sizeof(SimpleClass));
        for(unsigned long i = 0;i < n; i++)
        {
                ptr[i].InitMSG();
                ptr[i].ShowMSG();
        }
        return 0;
}
http://codepad.org/xRhfVKNZ
выдает сразу Segmentation fault, потому что состояние non-POD членов оказывается неопределенным (так как для них тоже конструкторы не вызываются)
при их ручной инициализации в InitMSG с исползованием operator=(*) их поведение не становится определенней
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
07.09.2011, 20:23     Освобождение памяти, занятой вектором #30
-=ЮрА=-, вы вообще знаете, зачем нужны конструкторы и деструкторы? Вы понимаете, что конструктор вашего класса не вызывается? Проверьте:

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
#include <windows.h>
#include <stdio.h>
 
class SimpleClass
{
private :
        char sMSG[256];
public:
        SimpleClass(){sMSG[0] = '\0'; puts("CONSTRUCTOR");};
        ~SimpleClass(){ puts("DESTRUCTOR"); };
 
 
        void InitMSG(){strcpy(sMSG,"I'm created\r\n");};
        void ShowMSG(){printf("%s\r\n",sMSG);};
 
};
 
int main()
{
        SimpleClass * ptr = (SimpleClass *)malloc(sizeof(SimpleClass));
        printf("Enter num of exemlars : ");
        unsigned long n;scanf("%u",&n);
        ptr = (SimpleClass *)realloc((void *)ptr,n*sizeof(SimpleClass));
        for(unsigned long i = 0;i < n; i++)
        {
                ptr[i].InitMSG();
                ptr[i].ShowMSG();
        }
        system("pause");
        return 0;
}
Вы понимаете, чем это чревато? А если бы у вас среди полей класса были тоже объекты, а не простые байтики в количестве 256? std::string, например? Им ведь тоже конструкторы вызывать кто-то должен.
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 20:33     Освобождение памяти, занятой вектором #31
Цитата Сообщение от grizlik78 Посмотреть сообщение
жасно. Вернее не так: Ужас-ужас.
- Так полегчает???

Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, вы вообще знаете, зачем нужны конструкторы и деструкторы? Вы понимаете, что конструктор вашего класса не вызывается? Проверьте:
- неа я из каменного века, но как вариант предлагаю это скомпилировать
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
#include <windows.h>
#include <stdio.h>
 
class SimpleClass
{
private :
    char sMSG[256];
public:
    SimpleClass(){strcpy(sMSG,"I'm created");}
    void CheckStatus(){printf("%s\r\n",sMSG);}
};
 
 
int main()
{
    SimpleClass * ptr = (SimpleClass *)malloc(sizeof(SimpleClass));
    printf("Enter num of exemlars : ");
    unsigned long n;scanf("%u",&n);
    ptr = (SimpleClass *)realloc((void *)ptr,n*sizeof(SimpleClass));
    for(unsigned long i = 0;i < n; i++)
    {
        ptr[i] = SimpleClass();
        ptr[i].CheckStatus();
    }
    system("pause");
    return 0;
}
Я всего лишь предлагаю ТС вправе выбрать то что ему по душе
Миниатюры
Освобождение памяти, занятой вектором  
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 20:36     Освобождение памяти, занятой вектором #32
PS:
SimpleClass(){strcpy(sMSG,"I'm created");}//Инициализировал переменную класса
void CheckStatus(){printf("%s\r\n",sMSG);} //Вывод переменной

C++
1
ptr[i] = SimpleClass();
- говорю делов ноль
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
07.09.2011, 20:44     Освобождение памяти, занятой вектором #33
-=ЮрА=-, а если после этого нужно изменить количество SimpleClass'ов? realloc? а как же деструкторы в случае уменьшения количества экземпляров или конструкторы в случае увеличения?

Добавлено через 5 минут
Так вот не проще:

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
#include <stdio.h>
#include <conio.h>
#include <cstring>
#include <vector>
 
class SimpleClass
{
private :
        char sMSG[256];
 
public:
        SimpleClass(){ strcpy(sMSG,"I'm created"); }
        void CheckStatus(){ printf("%s\r\n",sMSG); }
};
 
 
int main()
{
        printf("Enter num of exemlars : ");
 
        unsigned long n;
        scanf("%u",&n);
 
        std::vector<SimpleClass> vec ( n );
 
        for( unsigned long i = 0; i < n; i++ )
        {
            printf( "%i: ", i );
            vec[i].CheckStatus();
        }
 
        puts( "-------------" );
        getch();
 
        vec.resize( n*2 );
 
        for( unsigned long i = 0; i < n*2; i++ )
        {
            printf( "%i: ", i );
            vec[i].CheckStatus();
        }
 
        puts( "-------------" );
        getch();
 
        vec.resize( n/2 );
 
        for( unsigned long i = 0; i < n/2; i++ )
        {
            printf( "%i: ", i );
            vec[i].CheckStatus();
        }
 
 
 
        return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
07.09.2011, 22:13     Освобождение памяти, занятой вектором #34
Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, а если после этого нужно изменить количество SimpleClass'ов? realloc? а как же деструкторы в случае уменьшения количества экземпляров или конструкторы в случае увеличения?
Вот доработал свой наглядный пример

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
#include <windows.h>
#include <stdio.h>
 
 
class SimpleClass
{
private :
    unsigned long num;
    char sMSG[256];
    bool bCreated;
public:
    SimpleClass(int i)
    {
        bCreated = true;
        sprintf(sMSG,"class %u - I'm created",1 + (num = i));
    }
    ~SimpleClass()
    {
        sprintf(sMSG,"class %u - I'm destroyed",1 + num);
    }
    void CheckStatus()
    {
        printf("%s\r\n",sMSG);
    }
};
 
 
int main()
{
    SimpleClass * ptr = (SimpleClass *)malloc(sizeof(SimpleClass));
    printf("Enter num of examles : ");
    unsigned long i,n;scanf("%u",&n);
    ptr = (SimpleClass *)realloc((void *)ptr,n*sizeof(SimpleClass));
    for(i = 0;i < n; i++)
    {
        ptr[i] = SimpleClass(i);
        ptr[i].CheckStatus();
    }
    printf("Enter new num examles: ");
    unsigned long m;scanf("%u",&m);
    
    if(m < n)
    {
        for(i = n - 1;m <= i; i--)
        {
            ptr[i].~SimpleClass();//Дструктор ничего не делает
            ptr[i].CheckStatus();//поэтому вывожу CheckStatus,
                        //в реалии ~ удаляят всё, поєтому потом уже ничего не вызвать
                        //всё сделал чисто в ознакомительных целях
        }
        ptr = (SimpleClass *)realloc((void *)ptr,m*sizeof(SimpleClass));
    }
    else
    {
        ptr = (SimpleClass *)realloc((void *)ptr,m*sizeof(SimpleClass));
        for(i = n - 1;i < m; i++)
        {
            ptr[i] = SimpleClass(i);
            ptr[i].CheckStatus();
        }
    }
    system("pause");
    return 0;
}
Миниатюры
Освобождение памяти, занятой вектором  
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
07.09.2011, 22:33  [ТС]     Освобождение памяти, занятой вектором #35
Насколько мне было известно, ранее swap трюк не гарантировал освобождение памяти. В стандарте не было прописано что при этом должно выделиться меньше памяти под новый вектор. Теперь это не так?

Насчет того, что многие уверены что память вообще не нужно освобождать, в моём проекте, в тз отдельным пунктом идёт ограничение памяти под сервак 512 мегабайт. При этом нагрузка не прописана, будет работать на мощном сервере, с быстрой памятью и процом и поэтому частота переаллокаций не имеет никакого значения.
А сервак - что-то типо логера, он собрал одни данные, скинул их в базу, и далее данные надо частично затереть, т.к. параллельно в разное время начинают собираться отдельные массивы, каждый около 100 мегабайт. Если не чистить, то все 10 массивов разрастутся до 1 гб, а если чистить, то вполне можно уложиться в отведенный объем озу.
Т.ч. такие задачи существуют.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
07.09.2011, 22:35     Освобождение памяти, занятой вектором #36
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- неа я из каменного века, но как вариант предлагаю это скомпилировать
можно узнать что за среда? подозреваю, что realloc и malloc просто перебиты чем-то. Linux, gcc совершенно другое поведение. То есть память выделяется но конструкторы, как и положено, не вызываются.

а не, понял. не скопировал присваивание.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
07.09.2011, 22:39  [ТС]     Освобождение памяти, занятой вектором #37
Linux, но вектор, всмысле stl - кроссплатформенный, поэтому задал вопрос в данном разделе
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 00:58     Освобождение памяти, занятой вектором #38
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) он отдаст память, но там уже поздновато будет.
-=ЮрА=-
Заблокирован
Автор FAQ
08.09.2011, 10:16     Освобождение памяти, занятой вектором #39
Цитата Сообщение от villu Посмотреть сообщение
подозреваю, что realloc и malloc просто перебиты чем-то
- ОС XP 32 VisualStudio 6.0

Добавлено через 1 минуту
Цитата Сообщение от talis Посмотреть сообщение
меня (gcc 4.6) вектор выделяет память при расширении. При уменьшении количества элементов он вызывает деструкторы (кстати, обходя void destroy( pointer )), но память не отдаёт. После уничтожения самого объекта вектора (введите quit) он отдаст память, но там уже поздновато будет.
Сначало вызвать деструкторы для нужных объектов, потом обрезать память, в моём примере именно так и сделано...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2011, 10:54     Освобождение памяти, занятой вектором
Еще ссылки по теме:

с++ Освобождение памяти C++
C++ Освобождение памяти
C++ Освобождение памяти

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.09.2011, 10:54     Освобождение памяти, занятой вектором #40
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Сначало вызвать деструкторы для нужных объектов, потом обрезать память, в моём примере именно так и сделано...
вы вызываете конструктор анонимного объекта, а потом присваивание и это печально
правильно в вашем примере будет так и только так как у talis, с использованием placement new
Yandex
Объявления
08.09.2011, 10:54     Освобождение памяти, занятой вектором
Ответ Создать тему
Опции темы

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