Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как заполнить буфер массивом объектов? надо чтобы объекты создавались в буфере 
V
    Опции темы
roko
Дата 24.1.2010, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



предположим у меня есть класc

Код

class Person
{
   char* name;
public:
   Person();
   virtual ~Person();
   virtual void func1(int);
   ............
}



в программе выделяется буфер, например:

Код

char* buf=new char[sizeof(Person)*10];


Как мне создать 10 объектов Person так, чтобы они размещались в буфере buf?
И можно ли так использовать sizeof?

Это сообщение отредактировал(а) roko - 24.1.2010, 23:20
PM MAIL   Вверх
andrew_121
Дата 24.1.2010, 23:26 (ссылка) |   (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Код

Person* persons = new Person[10];



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
roko
Дата 24.1.2010, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



andrew_121, я в курсе что так можно, но мне надо разместить объекты в уже выделенном буфере. Например, в начале буфера будут одни данные, а потом массив из Person.

вот, нашел пример, но здесь только для одной переменной:
Код

Person *pPer=new((void*)buf) Person();


Это сообщение отредактировал(а) roko - 25.1.2010, 01:08
PM MAIL   Вверх
comcon1
Дата 24.1.2010, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



В моей глупой голове родилось что-то такое:
Код

char* buf = new char[sizeof(Person)*10];
Person a;
Person *pa = &a;

char *pi_src = (char*)pa;
char *pi_dst = buf;
for (int i=0; i<sizeof(Person); i++) {
   *pi_dst = *pi_src;
   ++pi_src;
   ++pi_dst;
}


Но это С-стайл.
Я уверен, есть специальные С++-ные библотечки. А-ля шаблоны сериалайза в память или переопределенные операторы new.


--------------------
PM MAIL   Вверх
roko
Дата 25.1.2010, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



comcon1, у вас только первый элемент массива будет, но в принципе ясно. Спасибо. Хотелось бы в одну строчку или как-нибудь так, чтобы меньше писать.
PM MAIL   Вверх
mes
Дата 25.1.2010, 00:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(comcon1 @  24.1.2010,  22:51 Найти цитируемый пост)
родилось что-то такое:

такое годится только для pod-объектов


roko, Вам поможет placement new. А узнать что это такое поможет гугль smile


--------------------
PM MAIL WWW   Вверх
roko
Дата 25.1.2010, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



mes, если мне надо массив из 10 Person, то правильно ли я делаю? :

Код

void* buf=new char[sizeof(Person)*10]
Person *pPer=new(buf) Person[10];
//здесь что-то делаем с элементами массива Person
//...........
//удаляем
delete []pPer;
delete []buf;


Это сообщение отредактировал(а) roko - 25.1.2010, 02:33
PM MAIL   Вверх
bsa
Дата 25.1.2010, 02:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



roko, нет. Нужно сначала вызвать деструкторы для всех Person, затем delete []buf
PM   Вверх
roko
Дата 25.1.2010, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



bsa, а если так?

Код

void* buf=new char[sizeof(Person)*10]
Person *pPer=new(buf) Person[10];
//здесь что-то делаем с элементами массива Person
//...........
//удаляем
for(int i=0;i<10;i++)
   (pPer+i)->~Person();
delete []buf;

PM MAIL   Вверх
bsa
Дата 25.1.2010, 10:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(roko @  25.1.2010,  02:48 Найти цитируемый пост)
bsa, а если так?
Что значит если? Это именно то, что я написал smile

PM   Вверх
Леопольд
Дата 25.1.2010, 10:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(roko @  25.1.2010,  02:48 Найти цитируемый пост)
void* buf=new char[sizeof(Person)*10]

Нескромный вопрос. А зачем так извращаться?


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
roko
Дата 25.1.2010, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



bsa, огромное спасибо smile 


Цитата(Леопольд @ 25.1.2010,  10:45)
Цитата(roko @  25.1.2010,  02:48 Найти цитируемый пост)
void* buf=new char[sizeof(Person)*10]

Нескромный вопрос. А зачем так извращаться?


а как, по вашему мнению, надо?

Ну а если вы о том зачем вообще мне создавать переменные в буфере... Мне нужно выделять память небольшими кусками под разные объекты, но в диспетчере задач видно, что если часто использовать new то памяти расходуется гораздо больше, чем если один раз вызвать new. А мне какраз нужно фиксированное число объектов.
PM MAIL   Вверх
saneea
Дата 25.1.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



Цитата

Мне нужно выделять память небольшими кусками под разные объекты, но в диспетчере задач видно, что если часто использовать new то памяти расходуется гораздо больше, чем если один раз вызвать new. А мне какраз нужно фиксированное число объектов.


roko, а можно ещё писать собственные распределители памяти...
PM MAIL   Вверх
roko
Дата 25.1.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



saneea, обязательно почитаю о распределителях, но пока достаточно и этого.

Всем спасибо. smile  Вопрос решен.

Это сообщение отредактировал(а) roko - 25.1.2010, 20:06
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0753 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.