Есть задачка, где-то я видел ее решение, но не помню где. Не подскажет ли уважаемое ссобщество?
Надо создать объект какого-то класса по определенному адресу в памяти. Т. е. сначала выделить память необходимого размере, а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется).
Спасибо, заранее...
Re: создание объект по определенному адресу в памяти
Здравствуйте, Аноним, Вы писали:
А>Доброго времени суток, всем!
А>Есть задачка, где-то я видел ее решение, но не помню где. Не подскажет ли уважаемое ссобщество?
А>Надо создать объект какого-то класса по определенному адресу в памяти. Т. е. сначала выделить память необходимого размере, а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется). А>Спасибо, заранее...
#include <new>
class some {/**/};
...
char* ptr = new char[sizeof(some)];
some* ps = new (ptr) some();
...
ps->~some();//Не забываем явно вызвать деструкторdelete [] ptr;//... и освободить память
Любите книгу — источник знаний (с) М.Горький
Re: создание объект по определенному адресу в памяти
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]: создание объект по определенному адресу в памяти
В 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]: создание объект по определенному адресу в памяти
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]: создание объект по определенному адресу в памяти
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]: создание объект по определенному адресу в памяти
Здравствуйте, srggal, Вы писали:
S>Про "ручной" вариант уже сказали. S>Однако не стоит забывать про allocator'ы: S>allocator::construct
Не вижу смыла вспоминать про allocator'ы в данном контексте — метод construct способен создать новый объект по указанному адресу только с помощью конструктора копии, чего недостаточно во многих случаях. Да и по внешнему виду код с аллокатором проигрывает (ИМХО конечно):
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]: создание объект по определенному адресу в памяти
Здравствуйте, Аноним, Вы писали:
А>Понятно. Значит выделить память, именно, под объект класса (без вызова конструктора) нельзя.
Ну почему же нельзя:
void* ptr = ::operator new(sizeof(some));//Выделяем память без вызова конструктора
some* ps = new(ptr) some();//...вызываем конструктор
Вот только обычное new-expression делает то же самое
А>Можно только под массив char, равный размеру объекта класса?
Память можно выделить как угодно и где угодно — главное, чтобы размер был достаточен, и были соблюдены требования по выравниванию.
Любите книгу — источник знаний (с) М.Горький
Re[3]: создание объект по определенному адресу в памяти
Здравствуйте, Bell, Вы писали:
B>Не вижу смыла вспоминать про allocator'ы в данном контексте — метод construct способен создать новый объект по указанному адресу только с помощью конструктора копии, чего недостаточно во многих случаях. Да и по внешнему виду код с аллокатором проигрывает (ИМХО конечно):
В контесте какой задачи ?
Этой?
Надо создать объект какого-то класса по определенному адресу в памяти. Т. е. сначала выделить память необходимого размере, а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется).
Про то, как выделить память — что нить сказано ?
Нет, следовательно имеем право, для общего решения задачи, абстрагироваться от методов выделения памяти, и тут всплывают аллокаторы
Кроме того, АТ может не знать о ткой вещи как аллокатор, теперь он о ней знает.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: создание объект по определенному адресу в памяти
Мои 5копеек:
Для пущей наглядности имело бы смысл, ИМХО, привести в пример выделение/освобождение при помощи malloc/fre с последующим конструированием placement new.
Кроме того, подчеркну, что для инкапсуляции стратегий выделения и освобождения памяти придуман allocatorю
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: создание объект по определенному адресу в памяти
Здравствуйте, srggal, Вы писали:
S>В контесте какой задачи ? S>Этой? S>
S>Надо создать объект какого-то класса по определенному адресу в памяти. Т. е. сначала выделить память необходимого размере, а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется).
S>Про то, как выделить память — что нить сказано ?
S>Нет, следовательно имеем право, для общего решения задачи, абстрагироваться от методов выделения памяти, и тут всплывают аллокаторы
Ах так? Тогда вот:
...а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется).
Где упоминание, что создавать будем именно с конструктором копирования?
S>Кроме того, АТ может не знать о ткой вещи как аллокатор, теперь он о ней знает. S>
Это, безусловно, плюс
[] S>>Про то, как выделить память — что нить сказано ?
S>>Нет, следовательно имеем право, для общего решения задачи, абстрагироваться от методов выделения памяти, и тут всплывают аллокаторы
B>Ах так? Тогда вот: B>
B>...а потом в этой, выделенной памяти создать объект (с вызовом конструктора, разумеется).
B>Где упоминание, что создавать будем именно с конструктором копирования? B>
Не вижу и обратного, где указано каким конструктором пользоваться ?