создание объект по определенному адресу в памяти
От: Аноним  
Дата: 28.11.05 16:29
Оценка:
Доброго времени суток, всем!


Есть задачка, где-то я видел ее решение, но не помню где. Не подскажет ли уважаемое ссобщество?

Надо создать объект какого-то класса по определенному адресу в памяти. Т. е. сначала выделить память необходимого размере, а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется).
Спасибо, заранее...
Re: создание объект по определенному адресу в памяти
От: Bell Россия  
Дата: 28.11.05 16:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброго времени суток, всем!



А>Есть задачка, где-то я видел ее решение, но не помню где. Не подскажет ли уважаемое ссобщество?


А>Надо создать объект какого-то класса по определенному адресу в памяти. Т. е. сначала выделить память необходимого размере, а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется).

А>Спасибо, заранее...


#include <new>

class some {/**/};
...
char* ptr = new char[sizeof(some)];
some* ps = new (ptr) some();
...
ps->~some();//Не забываем явно вызвать деструктор
delete [] ptr;//... и освободить память
Любите книгу — источник знаний (с) М.Горький
Re: создание объект по определенному адресу в памяти
От: andrij Украина  
Дата: 28.11.05 16:34
Оценка:
On Mon, 28 Nov 2005 18:29:22 +0200, wrote:

> Доброго времени суток, всем!

> Надо создать объект какого-то класса по определенному адресу в памяти. Т. е. сначала выделить память необходимого размере, а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется).
> Спасибо, заранее...

есть такая штука ка експлисит нью:
  CClass* pClass = new(p) CClass();
// Где p - ето указатель на область в пам'яти необходимого размера, иначе просто потрьот что попало ...


Posted via RSDN NNTP Server 1.9
make it simple as possible, but not simpler
Re[2]: создание объект по определенному адресу в памяти
От: Bell Россия  
Дата: 28.11.05 16:35
Оценка:
Здравствуйте, andrij, Вы писали:

A>есть такая штука ка експлисит нью:


placement new

Любите книгу — источник знаний (с) М.Горький
Re: создание объект по определенному адресу в памяти
От: srggal Украина  
Дата: 28.11.05 16:37
Оценка: 1 (1)
Здравствуйте, <Аноним>, Вы писали:

А>Доброго времени суток, всем!



А>Есть задачка, где-то я видел ее решение, но не помню где. Не подскажет ли уважаемое ссобщество?


Про "ручной" вариант уже сказали.

Однако не стоит забывать про allocator'ы:

allocator::construct
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: создание объект по определенному адресу в памяти
От: Аноним  
Дата: 28.11.05 16:49
Оценка:
Здравствуйте, srggal, Вы писали:

S>Про "ручной" вариант уже сказали.


S>Однако не стоит забывать про allocator'ы:


S>allocator::construct


А можно поподробней, хотя, конечно, и "ручной" вариант вполне сойдет...
Re[3]: создание объект по определенному адресу в памяти
От: andrij Украина  
Дата: 28.11.05 16:53
Оценка:
On Mon, 28 Nov 2005 18:35:29 +0200, Bell <3057@users.rsdn.ru> wrote:


>

> placement new

>

точно — попутал , спасибо,
очень спешил ответить
Posted via RSDN NNTP Server 1.9
make it simple as possible, but not simpler
Re[3]: создание объект по определенному адресу в памяти
От: srggal Украина  
Дата: 28.11.05 16:56
Оценка:
Здравствуйте, <Аноним>, Вы писали:

[]

В MSDN есть описание, поэтому не вижу смысла его приводить.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: создание объект по определенному адресу в памяти
От: Аноним  
Дата: 29.11.05 07:59
Оценка:
Здравствуйте, Bell, Вы писали:


B>
B>#include <new>

B>class some {/**/};
B>...
B>char* ptr = new char[sizeof(some)];
B>some* ps = new (ptr) some();

а, если, в этом месте указателем ps проинициализировать указатель auto_ptr

std::auto_ptr<some> ap(ps);

то при выходе из текущей функции деструктор класса some вызывается автоматически, это я вижу. А освобождается ли память?

B>...
ps->>~some();//Не забываем явно вызвать деструктор
B>delete [] ptr;//... и освободить память
B>
Re[3]: создание объект по определенному адресу в памяти
От: Bell Россия  
Дата: 29.11.05 08:04
Оценка:
Здравствуйте, Аноним, Вы писали:
B>>
B>>#include <new>

B>>class some {/**/};
B>>...
B>>char* ptr = new char[sizeof(some)];
B>>some* ps = new (ptr) some();

А>а, если, в этом месте указателем ps проинициализировать указатель auto_ptr

А>std::auto_ptr<some> ap(ps);

А>то при выходе из текущей функции деструктор класса some вызывается автоматически, это я вижу. А освобождается ли память?
...
B>>


Деструктор auto_ptr вызовет деструктор класса some а потом operator delete для освобождения помяти, что есть неопределенное поведение, поскольку выделялась память с помощью operator new []
Любите книгу — источник знаний (с) М.Горький
Re[3]: создание объект по определенному адресу в памяти
От: andrij Украина  
Дата: 29.11.05 08:16
Оценка:
On Tue, 29 Nov 2005 09:59:57 +0200, wrote:

> Здравствуйте, Bell, Вы писали:

>
>
> B>
> B>#include <new>
>
> B>class some {/**/};
> B>...
> B>char* ptr = new char[sizeof(some)];
> B>some* ps = new (ptr) some();
>
> а, если, в этом месте указателем ps проинициализировать указатель auto_ptr
>
> std::auto_ptr<some> ap(ps);
>
> то при выходе из текущей функции деструктор класса some вызывается автоматически, это я вижу. А освобождается ли память?

// если память была виделена с помощью new для каждого об'екта в отдельности
// то скорее всево ето сработает, но в таком случае нет пользы от использования
// такого сложного способа инициализыции.

// но если будет:
char* ptr = new char[sizeof(some) * 2];
// char* ptr инициализирован какимто другим способом
some* ps = new (ptr) some();
some* ps2 = new (ptr+sizeof(some)) some();
// то в етом случае delete ps2 приведет к ошибке, а возможно и краху программы.

>
> B>...
> ps->>~some();//Не забываем явно вызвать деструктор
> B>delete [] ptr;//... и освободить память
> B>
Posted via RSDN NNTP Server 1.9
make it simple as possible, but not simpler
Re[2]: создание объект по определенному адресу в памяти
От: Bell Россия  
Дата: 29.11.05 08:42
Оценка: +1
Здравствуйте, srggal, Вы писали:

S>Про "ручной" вариант уже сказали.

S>Однако не стоит забывать про allocator'ы:
S>allocator::construct

Не вижу смыла вспоминать про allocator'ы в данном контексте — метод construct способен создать новый объект по указанному адресу только с помощью конструктора копии, чего недостаточно во многих случаях. Да и по внешнему виду код с аллокатором проигрывает (ИМХО конечно):

#include <new>
#include <memory>

class some{/**/};

void f()
{
   std::allocator<some> a;
   some* ptr = a.allocate(1);
   a.construct(ptr, some());

   a.destroy(ptr);
   a.deallocate(ptr, 1);
}
Любите книгу — источник знаний (с) М.Горький
Re[4]: создание объект по определенному адресу в памяти
От: Аноним  
Дата: 29.11.05 08:48
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:

B>>>
B>>>#include <new>

B>>>class some {/**/};
B>>>...
B>>>char* ptr = new char[sizeof(some)];
B>>>some* ps = new (ptr) some();

А>>а, если, в этом месте указателем ps проинициализировать указатель auto_ptr

А>>std::auto_ptr<some> ap(ps);

А>>то при выходе из текущей функции деструктор класса some вызывается автоматически, это я вижу. А освобождается ли память?
B>...
B>>>


B>Деструктор auto_ptr вызовет деструктор класса some а потом operator delete для освобождения помяти, что есть неопределенное поведение, поскольку выделялась память с помощью operator new []


Понятно. Значит выделить память, именно, под объект класса (без вызова конструктора) нельзя. Можно только под массив char, равный размеру объекта класса?
Re[5]: создание объект по определенному адресу в памяти
От: Bell Россия  
Дата: 29.11.05 09:10
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Понятно. Значит выделить память, именно, под объект класса (без вызова конструктора) нельзя.

Ну почему же нельзя:
void* ptr = ::operator new(sizeof(some));//Выделяем память без вызова конструктора
some* ps = new(ptr) some();//...вызываем конструктор

Вот только обычное new-expression делает то же самое

А>Можно только под массив char, равный размеру объекта класса?

Память можно выделить как угодно и где угодно — главное, чтобы размер был достаточен, и были соблюдены требования по выравниванию.
Любите книгу — источник знаний (с) М.Горький
Re[3]: создание объект по определенному адресу в памяти
От: srggal Украина  
Дата: 29.11.05 09:26
Оценка:
Здравствуйте, Bell, Вы писали:

B>Не вижу смыла вспоминать про allocator'ы в данном контексте — метод construct способен создать новый объект по указанному адресу только с помощью конструктора копии, чего недостаточно во многих случаях. Да и по внешнему виду код с аллокатором проигрывает (ИМХО конечно):


В контесте какой задачи ?

Этой?

Надо создать объект какого-то класса по определенному адресу в памяти. Т. е. сначала выделить память необходимого размере, а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется).


Про то, как выделить память — что нить сказано ?

Нет, следовательно имеем право, для общего решения задачи, абстрагироваться от методов выделения памяти, и тут всплывают аллокаторы

Кроме того, АТ может не знать о ткой вещи как аллокатор, теперь он о ней знает.

... << RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: создание объект по определенному адресу в памяти
От: srggal Украина  
Дата: 29.11.05 09:34
Оценка:
Здравствуйте, <Аноним>, Вы писали:

Мои 5копеек:
Для пущей наглядности имело бы смысл, ИМХО, привести в пример выделение/освобождение при помощи malloc/fre с последующим конструированием placement new.

Кроме того, подчеркну, что для инкапсуляции стратегий выделения и освобождения памяти придуман allocatorю
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: создание объект по определенному адресу в памяти
От: Bell Россия  
Дата: 29.11.05 09:36
Оценка:
Здравствуйте, srggal, Вы писали:

S>В контесте какой задачи ?

S>Этой?
S>

S>Надо создать объект какого-то класса по определенному адресу в памяти. Т. е. сначала выделить память необходимого размере, а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется).


S>Про то, как выделить память — что нить сказано ?


S>Нет, следовательно имеем право, для общего решения задачи, абстрагироваться от методов выделения памяти, и тут всплывают аллокаторы


Ах так? Тогда вот:

...а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется).

Где упоминание, что создавать будем именно с конструктором копирования?


S>Кроме того, АТ может не знать о ткой вещи как аллокатор, теперь он о ней знает.

S>
Это, безусловно, плюс
Любите книгу — источник знаний (с) М.Горький
ОФФТОП
От: srggal Украина  
Дата: 29.11.05 09:38
Оценка: :)
Здравствуйте, Bell, Вы писали:

[]
S>>Про то, как выделить память — что нить сказано ?

S>>Нет, следовательно имеем право, для общего решения задачи, абстрагироваться от методов выделения памяти, и тут всплывают аллокаторы


B>Ах так? Тогда вот:

B>

B>...а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется).

B>Где упоминание, что создавать будем именно с конструктором копирования?
B>
Не вижу и обратного, где указано каким конструктором пользоваться ?


... << RSDN@Home 1.1.4 stable rev. 510>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.