Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/35: Рейтинг темы: голосов - 35, средняя оценка - 4.51
 Аватар для Union
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252

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

07.09.2011, 14:30. Показов 7956. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня задача требует чтобы у вектора было в резерве не более 100 элементов. При постоянном росте вектора понятно как это обеспечить, а вот как быть при уменьшении количества элементов? Я не в курсе последних стандартов, подскажите есть ли сейчас способы гарантированного освобождения памяти, занятой вектором, и вообще какие способы существуют?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.09.2011, 14:30
Ответы с готовыми решениями:

Освобождение неиспользуемой вектором памяти
Есть ли вменяемый способ освободить зарезервированную память, которая зарезервирована сверх того, что нужно? Одним словом...

Резервирование памяти/освобождение памяти для трехмерного массива
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

Освобождение памяти
Есть класс, в котором я выделяю память с помощью new. В деструкторе класса я с помощью delete освобождаю память, но у меня вылетает ошибка...

62
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.09.2011, 19:44
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 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));
        
    }
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
07.09.2011, 19:49
-=ЮрА=-, при malloc не вызывается конструктор (вызывать можно через placement new), при free не вызывается деструктор (можно правда напрямую вызвать ->~Type())
это как бэ не сильно удобно, да и вообще
IDiscRecorder есть структура, элементы которой указатели на функции, те пример мало для объектов пригоден
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
07.09.2011, 19:50
-=ЮрА=-, запустите этот код:

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 секунд

Не по теме:

Опоздал...

0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.09.2011, 19:55
Цитата Сообщение от alex_x_x Посмотреть сообщение
IDiscRecorder есть структура
http://msdn.microsoft.com/en-u... .85).aspx;)

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

alex_x_x, вы работали с imapi v1?У меня даже вышло подключить IDiscMasterProgressEvents (хотя это был огромооомный гемор - в нете кучи топиков что интерфейс не работает) и сделать полнофункциональный бёрнер, так что с имапи знаком не по наслышке...
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
07.09.2011, 20:01
-=ЮрА=-, я знаком с 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();
}
и адрес структуры/интерфейса будет совпадать с таблицей виртуальных функций, чтото вроде
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.09.2011, 20:13
Цитата Сообщение от 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;
}
Миниатюры
Освобождение памяти, занятой вектором  
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.09.2011, 20:16
PS:Создал массив объектов (классов) посредством malloc и realloc, думаю все вопроссы должны отпасть сами собой..!

Добавлено через 1 минуту
Цитата Сообщение от talis Посмотреть сообщение
CDummy() : status(INITIATED){ std::cout << "CDummy();"; };
- предлагаю обратить внимание как выполнен конструктор в моём классе
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
SimpleClass(){sMSG[0] = '\0';}
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
07.09.2011, 20:17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вот код и скрин работы
Ужасно. Вернее не так: Ужас-ужас.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
07.09.2011, 20:20
-=ЮрА=-, во-первых это подмена понятий, во-вторых
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=(*) их поведение не становится определенней
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
07.09.2011, 20: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 <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, например? Им ведь тоже конструкторы вызывать кто-то должен.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.09.2011, 20:33
Цитата Сообщение от 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;
}
Я всего лишь предлагаю ТС вправе выбрать то что ему по душе
Миниатюры
Освобождение памяти, занятой вектором  
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.09.2011, 20:36
PS:
SimpleClass(){strcpy(sMSG,"I'm created");}//Инициализировал переменную класса
void CheckStatus(){printf("%s\r\n",sMSG);} //Вывод переменной

C++
1
ptr[i] = SimpleClass();
- говорю делов ноль
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
07.09.2011, 20:44
-=ЮрА=-, а если после этого нужно изменить количество 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;
}
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.09.2011, 22:13
Цитата Сообщение от 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;
}
Миниатюры
Освобождение памяти, занятой вектором  
0
 Аватар для Union
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
07.09.2011, 22:33  [ТС]
Насколько мне было известно, ранее swap трюк не гарантировал освобождение памяти. В стандарте не было прописано что при этом должно выделиться меньше памяти под новый вектор. Теперь это не так?

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

а не, понял. не скопировал присваивание.
0
 Аватар для Union
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
07.09.2011, 22:39  [ТС]
Linux, но вектор, всмысле stl - кроссплатформенный, поэтому задал вопрос в данном разделе
0
 Аватар для talis
794 / 546 / 61
Регистрация: 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) он отдаст память, но там уже поздновато будет.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.09.2011, 10:16
Цитата Сообщение от villu Посмотреть сообщение
подозреваю, что realloc и malloc просто перебиты чем-то
- ОС XP 32 VisualStudio 6.0

Добавлено через 1 минуту
Цитата Сообщение от talis Посмотреть сообщение
меня (gcc 4.6) вектор выделяет память при расширении. При уменьшении количества элементов он вызывает деструкторы (кстати, обходя void destroy( pointer )), но память не отдаёт. После уничтожения самого объекта вектора (введите quit) он отдаст память, но там уже поздновато будет.
Сначало вызвать деструкторы для нужных объектов, потом обрезать память, в моём примере именно так и сделано...
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
08.09.2011, 10:54
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Сначало вызвать деструкторы для нужных объектов, потом обрезать память, в моём примере именно так и сделано...
вы вызываете конструктор анонимного объекта, а потом присваивание и это печально
правильно в вашем примере будет так и только так как у talis, с использованием placement new
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.09.2011, 10:54

Освобождение памяти
Как сделать, чтобы при вызове деструктора экземпляра i класса image, вызвался и деструктор класса image_bmp? class image { public:...

Освобождение памяти
Похоже что проблема с освобождением памяти. У меня есть абстрактный класс CObject и его потомок CMeteor, в котором реализованы...

Освобождение памяти
Есть многопоточное приложение. Создается глобальная структура: Пример из msdn. typedef struct _MyData { int val1; ...

Освобождение памяти
Товарищи,недавно баловался в Microsoft VS,готовился к экзаменам,писал небольшие програмки с использованием динамических массивов.Память под...

Освобождение памяти
Добрый день. Пишу в рубрику &quot;Вопросы начинающих по С/С++&quot; посему вопрос глупый :) И все же, есть такой код //offset - массив...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru