Само собой что размешать объект надо в памяти, выделенной заранее.
В качестве примера, например, смотри как это может быть в std::vector
Память там выделяется при помощи std::allocator::allocate(......) что может означать вызов operator new(size); — выделен блок памяти, ничего в нем еще не сконструировано. Затем ты делаешь push_back(elem); ага, тут — то вызывается allocator::construct — а там new(pointer)T(val) — элемент конструируется копированием.
Of course, the code must be complete enough to compile and link.
Это не я так писал, а автор вопроса. И потом про вызов деструктора ты это зря, ведь из исходного вопроса неясно, что такое Arr. Согласись, что Arr может быть много чем.
Of course, the code must be complete enough to compile and link.
Здравствуйте, bxMax, Вы писали:
M>А вообще, раз возникло столько споров о смысле мероприятия: M>Создается массив объектов CArray M> CArray *Arr=new CArray[size]; M>Насколько я понимаю, объекты остаються неинициализированными. Вот для того чтобы их инициализировать я и хочу вызывать placement new: M> new(&Arr[n]) CArray(); M>Просто не хочеться выделять отдельно блоки памяти под каждый элемент. M>Будет работать?
Я знал, я знал!
Когда ты пишешь
CArray *Arr=new CArray[size];
то создается массив объектов CArray, причем каждый из элементов этого массива — вполне нормальный, инициализированный объект, который в "дополнительной инициализации" не нуждается.
В одной нитей написали о синтаксисе new позволяющем присвоить объекту память без выделения её. Очень-очень вовремя для меня. Но при попытке использования этого синтаксиса компилятор дает мне ошибку
'new' : no overloaded function takes 2 parameters.
Я пишу вот так —
new(Arr) CArray(1);
В чем моя ошибка?
Здравствуйте, bxMax, Вы писали:
M>В одной нитей написали о синтаксисе new позволяющем присвоить объекту память без выделения её.
А для чего нужно такое и где используется(можно на примере)!
Да и как работать с таким объектом, если память под него не выделена?
Здравствуйте, bxMax, Вы писали:
M>В одной нитей написали о синтаксисе new позволяющем присвоить объекту память без выделения её. Очень-очень вовремя для меня. Но при попытке использования этого синтаксиса компилятор дает мне ошибку M>'new' : no overloaded function takes 2 parameters. M>Я пишу вот так — M>new(Arr) CArray(1); M>В чем моя ошибка?
Так, на всякий случай: если ты надеешься, что в данном случае не произойдет перевыделения памяти, то ты ошибаешься.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Синтаксис new
От:
Аноним
Дата:
06.08.03 09:24
Оценка:
B>Так, на всякий случай: если ты надеешься, что в данном случае не произойдет перевыделения памяти, то ты ошибаешься.
Ты о чем это? О том, что хоть память под сам объект CArray не выделится, выделится память под элементы? Если да, то согласен, если нет, то поясни, пожалуйста.
Здравствуйте, Аноним, Вы писали:
B>>Так, на всякий случай: если ты надеешься, что в данном случае не произойдет перевыделения памяти, то ты ошибаешься.
А>Ты о чем это? О том, что хоть память под сам объект CArray не выделится, выделится память под элементы? Если да, то согласен, если нет, то поясни, пожалуйста.
Именно это я и имел ввиду.
И если ты это знаешь, то я не могу понять, зачем здесь placement new? Тем более, если ты перед строкой
new(Arr) CArray(1);
не вызвал явно деструктор для объекта Arr, то произойдет утечка памяти.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Это не я так писал, а автор вопроса.
Неет, это был не ты, а какой-то злобный Аноним И я (почему-то) принял его за автора.
L_L>И потом про вызов деструктора ты это зря, ведь из исходного вопроса неясно, что такое Arr. Согласись, что Arr может быть много чем.
Да согласен, поторопился. Но больно уж имя Arr напиминает объект-контейнер...
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Само собой что размешать объект надо в памяти, выделенной заранее. L_L>В качестве примера, например, смотри как это может быть в std::vector
L_L>Память там выделяется при помощи std::allocator::allocate(......) что может означать вызов operator new(size); — выделен блок памяти, ничего в нем еще не сконструировано. Затем ты делаешь push_back(elem); ага, тут — то вызывается allocator::construct — а там new(pointer)T(val) — элемент конструируется копированием.
К чему я это спросил: мне как раз нужно было чтобы объект создался по определенном адресу.
То есть я понимаю, вышеописанными изощрениями, возможно запись объекта в определенный участок памяти?
Но как работает такой метод если объект содержит виртуальные методы и само собой объекты родители?
Суть в том, что ты в некоторой сырой памяти таким образом полноценно конструируешь объект — т.е. все конструкторы всех базовых подобъектов и членов вызываются и т.д. Разумеется, памяти должно хватать и есть еще определенные ограничения.
Of course, the code must be complete enough to compile and link.
Re[2]: Синтаксис new - уточните
От:
Аноним
Дата:
06.08.03 09:47
Оценка:
Здравствуйте, __Avatar__, Вы писали:
M>>В одной нитей написали о синтаксисе new позволяющем присвоить объекту память без выделения её. __A>А для чего нужно такое и где используется(можно на примере)! __A>Да и как работать с таким объектом, если память под него не выделена?
#include <new>
#include <iostream>
struct foo
{
void bar() const
{
std::cout << "Hello World!" << std::endl;
}
};
int main()
{
void* baz = ::operator new(sizeof(foo)); // выделение памятиconst foo* qux = new(baz) foo(); // создание объекта
qux->bar(); // работа с объектом
qux->~foo(); // уничтожение объекта
::operator delete(baz); // освобождение памяти
}
Здравствуйте, __Avatar__, Вы писали:
__A>К чему я это спросил: мне как раз нужно было чтобы объект создался по определенном адресу. __A>То есть я понимаю, вышеописанными изощрениями, возможно запись объекта в определенный участок памяти? __A>Но как работает такой метод если объект содержит виртуальные методы и само собой объекты родители?
Все чики-пики. Такой синтаксис называется placement new — синтаксис размещения объекта. Абсолютно безопасен (как и обыкновенный топор ), легален, стандартен и документирован.
...
qux->>~foo(); // уничтожение объекта
А> ::operator delete(baz); // освобождение памяти
А>
То есть при вызове деструктора объекта память не высвобождается?
Что же тогда происходит по вызову деструктора(кроме описанных действий внутри тела метода-деструктора)?
Все что ни происходит — к лучшему!
Re[4]: Синтаксис new - уточните
От:
Аноним
Дата:
06.08.03 10:00
Оценка:
Здравствуйте, __Avatar__, Вы писали:
__A>То есть при вызове деструктора объекта память не высвобождается?
При явном вызове деструктора — нет.
__A>Что же тогда происходит по вызову деструктора(кроме описанных действий внутри тела метода-деструктора)?
А вообще, раз возникло столько споров о смысле мероприятия:
Создается массив объектов CArray
CArray *Arr=new CArray[size];
Насколько я понимаю, объекты остаються неинициализированными. Вот для того чтобы их инициализировать я и хочу вызывать placement new:
new(&Arr[n]) CArray();
Просто не хочеться выделять отдельно блоки памяти под каждый элемент.
Будет работать?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, __Avatar__, Вы писали:
__A>>То есть при вызове деструктора объекта память не высвобождается? А>При явном вызове деструктора — нет.
Таким образом память остается "не тронутой" и можно обращаться к элементам объекта?!
Я проверил: получается, что при явном вызове деструктора объекта, вызываются деструкторы его элементов(родителей тоже). Однако, если после этого вновь обратиться к элементам — можно с ними вполне нормально работать(скорее всего проиходит новое выделение памяти или что-то еще).
И даже после вызовы placement delete память под "активированные" элементы не высвобождается — утечка.
Все-так хотелось бы узнать специфику использвоание такого рода new и delete!
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, __Avatar__, Вы писали:
M>>>В одной нитей написали о синтаксисе new позволяющем присвоить объекту память без выделения её. __A>>А для чего нужно такое и где используется(можно на примере)! __A>>Да и как работать с таким объектом, если память под него не выделена?
А>
А>#include <new>
А>#include <iostream>
А>struct foo
А>{
А> void bar() const
А> {
А> std::cout << "Hello World!" << std::endl;
А> }
А>};
А>int main()
А>{
А> void* baz = ::operator new(sizeof(foo)); // выделение памяти
А> const foo* qux = new(baz) foo(); // создание объекта
qux->>bar(); // работа с объектом
qux->>~foo(); // уничтожение объекта
А> ::operator delete(baz); // освобождение памяти
А>}
А>
А такая фишка чисто в VC работает, или под gcc и другими компиляторами тоже должно работать?
Здравствуйте, bxMax, Вы писали:
M>В одной нитей написали о синтаксисе new позволяющем присвоить объекту память без выделения её. Очень-очень вовремя для меня. Но при попытке использования этого синтаксиса компилятор дает мне ошибку M>'new' : no overloaded function takes 2 parameters. M>Я пишу вот так — M>new(Arr) CArray(1); M>В чем моя ошибка?