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

Аналог realloc, знающий классы и вызывающий конструкторы/деструкторы - C++

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.02.2012, 09:45     Аналог realloc, знающий классы и вызывающий конструкторы/деструкторы #1
Можно ли сделать такой шаблон?
C++
1
2
3
4
5
6
7
8
9
10
class A
{
};
class B
{
};
A *a;
B *b;
a=MyReAlloc(a, 1024); // Размер куска памяти по указателю a становится равным 1024-м объектам (а не байтам), для каждого создаваемого объекта вызывается A::A(), а при сокращении размера для каждого удаляемого объекта вызывается A::~A()
b=MyReAlloc(b, 512); // Размер куска памяти по указателю b становится равным 512-ти объектам (а не байтам), для каждого создаваемого объекта вызывается B::B(), а при сокращении размера для каждого удаляемого объекта вызывается B::~B()
Как это сделать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2012, 09:45     Аналог realloc, знающий классы и вызывающий конструкторы/деструкторы
Посмотрите здесь:

C++ Классы. Конструкторы. Деструкторы
C++ Классы. Протокол класса. Конструкторы и деструкторы
C++ Классы. Протокол класса. Конструкторы и деструкторы
Классы. Протокол класса. Конструкторы и деструкторы C++
C++ Конструкторы и деструкторы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.02.2012, 18:33     Аналог realloc, знающий классы и вызывающий конструкторы/деструкторы #2
taras atavin, смотри как это сделано в std::vector.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
17.02.2012, 19:15     Аналог realloc, знающий классы и вызывающий конструкторы/деструкторы #3
Чтобы далеко не лазить, опишу вкратце, как оно там сделано. При увеличении размера вектор

а) вручную выделяет новый кусок памяти нужного размера: new_capacity * sizeof(type)

б) копирует содержимое старого куска памяти в новый при помощи вызовов in-place new, что можно грубо выразить следующим кодом:
C++
1
2
3
4
5
6
7
8
9
for(size_t i=0; i<this->size(); ++i)
{
#ifdef CPP_11  // если используется новый стандарт C++, то объекты перемещаются
    new (new_data + i) type(std::move(data[i]));
#else  // Ну или по-старому просто копируются
    new (new_data + i) type(data[i]);  // Копирование объекта в указанное место в уже выделенной памяти через вызов конструктора копирования
#endif
    data[i].~type();  // Старый объект уничтожается явным вызовом деструктора
}
в) старый кусок памяти освобождается и вектор начинает пользоваться новым
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 41
27.02.2014, 01:18     Аналог realloc, знающий классы и вызывающий конструкторы/деструкторы #4
Цитата Сообщение от taras atavin Посмотреть сообщение
Можно ли сделать такой шаблон?

class A
{
};
class B
{
};
A *a;
B *b;
a=MyReAlloc(a, 1024); // Размер куска памяти по указателю a становится равным 1024-м объектам (а не байтам), для каждого создаваемого объекта вызывается A::A(), а при сокращении размера для каждого удаляемого объекта вызывается A::~A()
b=MyReAlloc(b, 512); // Размер куска памяти по указателю b становится равным 512-ти объектам (а не байтам), для каждого создаваемого объекта вызывается B::B(), а при сокращении размера для каждого удаляемого объекта вызывается B::~B()
Как это сделать?
очень просто!!!

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template<typename TYPE> void MyRealloc(void* Memory, int size)
{
int oldsize = _msize(Memory)/sizeof(TYPE);
if (size == oldsize) return;
if (size > oldsize)
{
Memory = (TYPE*)realloc(Memory, sizeof(TYPE)*size); // увеличит память
for (int i = 0; i < size-oldsize; i++)
    {
    new (oldsize+i) TYPE; // вызовет конструктор
    }
}
else
{
for (int i = oldsize-1; i >= size; i--)
    {
     delete (((TYPE*)(Memory))+i); // вызовет деструктор
    }
Memory = (TYPE*)realloc(Memory, sizeof(TYPE)*size); уменьшит память
}
/*вызов функции*/
MyRealloc<A>(a, 1024);
MyRealloc<B>(b, 512);
А вообще это извращение. для таких целей пишется отдельно класс.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.02.2014, 10:44  [ТС]     Аналог realloc, знающий классы и вызывающий конструкторы/деструкторы #5
Цитата Сообщение от FinancialShark Посмотреть сообщение
MyRealloc<A>(a, 1024);
MyRealloc<B>(b, 512);
Ну не тот же синтаксис вызова.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
27.02.2014, 13:14     Аналог realloc, знающий классы и вызывающий конструкторы/деструкторы #6
FinancialShark, это не работает - realloc может выделить совсем другой участок памяти.
Yandex
Объявления
27.02.2014, 13:14     Аналог realloc, знающий классы и вызывающий конструкторы/деструкторы
Ответ Создать тему
Опции темы

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