Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
1

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

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

Author24 — интернет-сервис помощи студентам
У меня задача требует чтобы у вектора было в резерве не более 100 элементов. При постоянном росте вектора понятно как это обеспечить, а вот как быть при уменьшении количества элементов? Я не в курсе последних стандартов, подскажите есть ли сейчас способы гарантированного освобождения памяти, занятой вектором, и вообще какие способы существуют?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2011, 14:30
Ответы с готовыми решениями:

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

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

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

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

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

Не по теме:

Опоздал...

0
Заблокирован
Автор FAQ
07.09.2011, 19:55 24
Цитата Сообщение от 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
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
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();
}
и адрес структуры/интерфейса будет совпадать с таблицей виртуальных функций, чтото вроде
0
Заблокирован
Автор 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;
}
Миниатюры
Освобождение памяти, занятой вектором  
0
Заблокирован
Автор FAQ
07.09.2011, 20:16 27
PS:Создал массив объектов (классов) посредством malloc и realloc, думаю все вопроссы должны отпасть сами собой..!

Добавлено через 1 минуту
Цитата Сообщение от talis Посмотреть сообщение
CDummy() : status(INITIATED){ std::cout << "CDummy();"; };
- предлагаю обратить внимание как выполнен конструктор в моём классе
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
SimpleClass(){sMSG[0] = '\0';}
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
07.09.2011, 20:17 28
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вот код и скрин работы
Ужасно. Вернее не так: Ужас-ужас.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
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=(*) их поведение не становится определенней
0
794 / 546 / 61
Регистрация: 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, например? Им ведь тоже конструкторы вызывать кто-то должен.
0
Заблокирован
Автор 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;
}
Я всего лишь предлагаю ТС вправе выбрать то что ему по душе
Миниатюры
Освобождение памяти, занятой вектором  
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();
- говорю делов ноль
0
794 / 546 / 61
Регистрация: 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;
}
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;
}
Миниатюры
Освобождение памяти, занятой вектором  
0
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
07.09.2011, 22:33  [ТС] 35
Насколько мне было известно, ранее swap трюк не гарантировал освобождение памяти. В стандарте не было прописано что при этом должно выделиться меньше памяти под новый вектор. Теперь это не так?

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

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

Добавлено через 1 минуту
Цитата Сообщение от talis Посмотреть сообщение
меня (gcc 4.6) вектор выделяет память при расширении. При уменьшении количества элементов он вызывает деструкторы (кстати, обходя void destroy( pointer )), но память не отдаёт. После уничтожения самого объекта вектора (введите quit) он отдаст память, но там уже поздновато будет.
Сначало вызвать деструкторы для нужных объектов, потом обрезать память, в моём примере именно так и сделано...
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
08.09.2011, 10:54 40
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Сначало вызвать деструкторы для нужных объектов, потом обрезать память, в моём примере именно так и сделано...
вы вызываете конструктор анонимного объекта, а потом присваивание и это печально
правильно в вашем примере будет так и только так как у talis, с использованием placement new
0
08.09.2011, 10:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2011, 10:54
Помогаю со студенческими работами здесь

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

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

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

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

Освобождение памяти
Маленький вопросик, как правильно освобождать память выделенную под vector&lt;...&gt;, деструктором...

с++ Освобождение памяти
Здравствуйте, объявляю в классе: А ** а; Далее выделяю память в функции: а=0; a = new A*;...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru