Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
1

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

28.02.2012, 22:26. Показов 3935. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нормальной инфы на русском языке я так и не нашел в инете( про него читал в книге Программирование принципы и практика С++ Страуструп, но там так и реализацию функции для своего аллокатора , только дали интерфейс класс ), понял что есть 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);
};
вот не пойму как можно разрушить обьект не освобождая память( это просто затереть все значения которые находятся внутри обьекта?)

кто сними работал расскажите про него, вот к примеру у меня есть свой вектор но как сделать так что бы я мог добавлять в него обьекты которые не имеют конструктора по умолчанию, как в аллокаторе выделять память?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2012, 22:26
Ответы с готовыми решениями:

Реализовать алгоритм работы планировщика. Управление виртуальной памятью. Управление файловой системой
Разработка программы менеджера памяти. Свопинг. Сегментная схема организации памяти. Управление...

Распределитель памяти идентичный std::allocator. Непонятные синтаксис и концепция std::allocator::construct
Компилятор: MSVC 2010 Exress код моего класса распределяющего память под спойлером #include...

Управление памятью в Qt
Вопрос уточняющего характера. class MyWidget : public QWidget { Q_OBJECT public: MyWidget()...

Управление памятью в C++
Здравствуйте! Сколько уже читаю про указатели, но никак не пойму кое-что: когда их использовать?...

5
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.02.2012, 22:32 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, и явные вызовы деструкторов например
1
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
28.02.2012, 23:53  [ТС] 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 вопроса.
Как реализовать функцию деаллок?
правильно ли я реализовал конструкт?
и что мне делать в деструкторе контейнера для которого использую аллокатор( у меня вектор)
я так понял вызывать метод деаллок?
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.02.2012, 00:28 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 - не на гугл же мне ссылку давать
2
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
29.02.2012, 02:09  [ТС] 5
alex_x_x, я так понял placement new за указанным адресом создает обьект?
тоесть можно писать вот так
C++
1
int *p = new (new int) int(5);
только это не совсем привычно
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
29.02.2012, 02:44 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 в скобочках) (для него повозется конструктор в котором поделается что-то очень важное), а потом на память в которой он находится накатят еще один объект (еще раз позовется конструктор). Действия конструктора при первом конструировании не отменятся. Ну в общем такое двойное конструирование объекта в одной и той же памяти. Так же плохо, как и двойное удаление одного и того же.
0
29.02.2012, 02:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.02.2012, 02:44
Помогаю со студенческими работами здесь

Управление памятью
Добрый день. Как с помощью функции GlobalAlloc выделить память для массива размерностью M на N?

Управление памятью
Заранее прошу прощения за глупый вопрос (задаю его по причине новизны для меня C++) У меня есть...

Управление памятью
Здравствуйте. Решил сделать программу для работы с данными из файлов. Для этого мне нужно...

Управление памятью
1. Требования к управлению памятью 1.1. перемещение 1.2. защита 1.3. совместное...


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

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