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

Работа с allocator (управление памятью) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
28.02.2012, 22:26     Работа с allocator (управление памятью) #1
Нормальной инфы на русском языке я так и не нашел в инете( про него читал в книге Программирование принципы и практика С++ Страуструп, но там так и реализацию функции для своего аллокатора , только дали интерфейс класс ), понял что есть 4 основные функции
C++
1
2
3
4
5
6
7
8
9
temlpate<class T>
class allocator {
// ...
    T* allocate(int n);
    void deallocate(T* p, int n);
 
    void construct(T *p, const T& v);
    void destroy(T *p);
};
вот не пойму как можно разрушить обьект не освобождая память( это просто затереть все значения которые находятся внутри обьекта?)

кто сними работал расскажите про него, вот к примеру у меня есть свой вектор но как сделать так что бы я мог добавлять в него обьекты которые не имеют конструктора по умолчанию, как в аллокаторе выделять память?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
28.02.2012, 22:32     Работа с allocator (управление памятью) #2
Цитата Сообщение от HardMorg Посмотреть сообщение
вот не пойму как можно разрушить обьект не освобождая память( это просто затереть все значения которые находятся внутри обьекта?)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A {
public:
  A() {};
  ~A() {};
};
 
typedef unsigned char BYTE;
 
int main() {
  BYTE* data = new BYTE[sizeof(A) * 10];
  A* a = new (data)A();
  a->~A();
  delete data;
}
смотреть placement new, и явные вызовы деструкторов например
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
28.02.2012, 23:53  [ТС]     Работа с allocator (управление памятью) #3
Цитата Сообщение от alex_x_x Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A {
public:
  A() {};
  ~A() {};
};
 
typedef unsigned char BYTE;
 
int main() {
  BYTE* data = new BYTE[sizeof(A) * 10];
  A* a = new (data)A();
  a->~A();
  delete data;
}
смотреть placement new, и явные вызовы деструкторов например
прокоментируйте вот это строчку A* a = new (data)A();

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
typedef unsigned char BYTE;
 
template <class T>
class allocator {
 
public:
 
    T* allocate(int size_t) {
 
        BYTE *p = new BYTE[sizeof(T) * size_t];
        
        return (T*)p;
    }
 
    void deallocate(T *p, int n) {
        
    }
 
    void construct(T *p, T const & val) {
 
        *p = val;
    }
    void destroy(T *p) {
 
        p->~T();
    }
 
};
вот что то примерно этого?
только у меня еще 3 вопроса.
Как реализовать функцию деаллок?
правильно ли я реализовал конструкт?
и что мне делать в деструкторе контейнера для которого использую аллокатор( у меня вектор)
я так понял вызывать метод деаллок?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
29.02.2012, 00:28     Работа с allocator (управление памятью) #4
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
#include <iostream>
#define DBG do { std::cout << __FUNCTION__ << std::endl; } while(0)
 
typedef unsigned char BYTE;
 
template <class T>
class allocator {
public: 
        T* allocate(int size) {
                DBG;
                if (size <= 0) return NULL; 
                return (T*) new BYTE[size * sizeof(T)];
        }
 
        void deallocate(T *p, int n) {
                DBG;
                delete [] (BYTE*)p;
        }
 
        void construct(T *p, T const & val) {
                DBG;
                new (p) T(val);
        }
        void destroy(T *p) {
                DBG;
                p->~T();
        }
};
 
class A {
public:
        A(int a) : m_a(a) { std::cout << __FUNCTION__ << std::endl; }
        ~A() { DBG; }
        A(const A& a) { 
                DBG;
                m_a = a.m_a; 
        }
        void setA(int a) { m_a = a; }
        int getA() { return m_a; }
private:
        int m_a;
};
 
int main() {
        allocator<A> alloc;
        unsigned i;
        A* arr[5], a(-1), *first = alloc.allocate(5);
 
        for (i=0 ; i<5 ; ++i) { arr[i] = &first[i]; }
        
        for (i=0;i<5;++i) {
            a.setA(i);
            alloc.construct(arr[i], a);
        }
        for (i=0;i<5;++i) {
            std::cout << arr[i]->getA() << std::endl;
            alloc.destroy(arr[i]);
        }
        alloc.deallocate(first, 5);       
}
Добавлено через 1 минуту
Цитата Сообщение от HardMorg Посмотреть сообщение
прокоментируйте вот это строчку A* a = new (data)A();
это placement new - не на гугл же мне ссылку давать
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
29.02.2012, 02:09  [ТС]     Работа с allocator (управление памятью) #5
alex_x_x, я так понял placement new за указанным адресом создает обьект?
тоесть можно писать вот так
C++
1
int *p = new (new int) int(5);
только это не совсем привычно
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.02.2012, 02:44     Работа с allocator (управление памятью) #6
C++
1
int *p = new (pointerToAllocatedMemory) int(5);
Размещающему new передают уже выделенную где-то память. сам он ее не выделяет. он лишь конструирует в ней объекты.

C++
1
int *p = new (new int) int(5);
Так наверно можно написать, но это не естественное использование размещающего new.
зачем так делать, если можно просто int* p = new int(5);
К тому же это будет глючить в случае более сложных чем инт объектов. Сложный объект сперва создастся обычным способом (из-за new в скобочках) (для него повозется конструктор в котором поделается что-то очень важное), а потом на память в которой он находится накатят еще один объект (еще раз позовется конструктор). Действия конструктора при первом конструировании не отменятся. Ну в общем такое двойное конструирование объекта в одной и той же памяти. Так же плохо, как и двойное удаление одного и того же.
Yandex
Объявления
29.02.2012, 02:44     Работа с allocator (управление памятью)
Ответ Создать тему
Опции темы

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