Синтаксис new
От: bxMax Россия baxmax.narod.ru
Дата: 06.08.03 08:47
Оценка:
В одной нитей написали о синтаксисе new позволяющем присвоить объекту память без выделения её. Очень-очень вовремя для меня. Но при попытке использования этого синтаксиса компилятор дает мне ошибку
'new' : no overloaded function takes 2 parameters.
Я пишу вот так —
new(Arr) CArray(1);
В чем моя ошибка?
Re: Синтаксис new
От: Аноним  
Дата: 06.08.03 08:51
Оценка: +1
Здравствуйте, bxMax, Вы писали:

M>Я пишу вот так —

M>new(Arr) CArray(1);
M>В чем моя ошибка?

Надо включить <new>.
Re: Синтаксис new - уточните
От: __Avatar__ Украина  
Дата: 06.08.03 09:08
Оценка:
Здравствуйте, bxMax, Вы писали:

M>В одной нитей написали о синтаксисе new позволяющем присвоить объекту память без выделения её.

А для чего нужно такое и где используется(можно на примере)!
Да и как работать с таким объектом, если память под него не выделена?
Все что ни происходит — к лучшему!
Re: Синтаксис new
От: Bell Россия  
Дата: 06.08.03 09:11
Оценка:
Здравствуйте, bxMax, Вы писали:

M>В одной нитей написали о синтаксисе new позволяющем присвоить объекту память без выделения её. Очень-очень вовремя для меня. Но при попытке использования этого синтаксиса компилятор дает мне ошибку

M>'new' : no overloaded function takes 2 parameters.
M>Я пишу вот так —
M>new(Arr) CArray(1);
M>В чем моя ошибка?

Так, на всякий случай: если ты надеешься, что в данном случае не произойдет перевыделения памяти, то ты ошибаешься.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Синтаксис new - уточните
От: Lorenzo_LAMAS  
Дата: 06.08.03 09:21
Оценка: 1 (1)
Само собой что размешать объект надо в памяти, выделенной заранее.
В качестве примера, например, смотри как это может быть в 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.
Re[2]: Синтаксис new
От: Аноним  
Дата: 06.08.03 09:24
Оценка:
B>Так, на всякий случай: если ты надеешься, что в данном случае не произойдет перевыделения памяти, то ты ошибаешься.

Ты о чем это? О том, что хоть память под сам объект CArray не выделится, выделится память под элементы? Если да, то согласен, если нет, то поясни, пожалуйста.
Re[3]: Синтаксис new
От: Bell Россия  
Дата: 06.08.03 09:28
Оценка:
Здравствуйте, Аноним, Вы писали:

B>>Так, на всякий случай: если ты надеешься, что в данном случае не произойдет перевыделения памяти, то ты ошибаешься.


А>Ты о чем это? О том, что хоть память под сам объект CArray не выделится, выделится память под элементы? Если да, то согласен, если нет, то поясни, пожалуйста.

Именно это я и имел ввиду.
И если ты это знаешь, то я не могу понять, зачем здесь placement new? Тем более, если ты перед строкой
new(Arr) CArray(1);

не вызвал явно деструктор для объекта Arr, то произойдет утечка памяти.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Синтаксис new
От: Lorenzo_LAMAS  
Дата: 06.08.03 09:31
Оценка: 1 (1)
Это не я так писал, а автор вопроса. И потом про вызов деструктора ты это зря, ведь из исходного вопроса неясно, что такое Arr. Согласись, что Arr может быть много чем.
Of course, the code must be complete enough to compile and link.
Re[5]: Синтаксис new
От: Bell Россия  
Дата: 06.08.03 09:35
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Это не я так писал, а автор вопроса.

Неет, это был не ты, а какой-то злобный Аноним И я (почему-то) принял его за автора.

L_L>И потом про вызов деструктора ты это зря, ведь из исходного вопроса неясно, что такое Arr. Согласись, что Arr может быть много чем.


Да согласен, поторопился. Но больно уж имя Arr напиминает объект-контейнер...
Любите книгу — источник знаний (с) М.Горький
Re[3]: Синтаксис new - уточните
От: __Avatar__ Украина  
Дата: 06.08.03 09:40
Оценка:
Здравствуйте, 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) — элемент конструируется копированием.

К чему я это спросил: мне как раз нужно было чтобы объект создался по определенном адресу.
То есть я понимаю, вышеописанными изощрениями, возможно запись объекта в определенный участок памяти?
Но как работает такой метод если объект содержит виртуальные методы и само собой объекты родители?
Все что ни происходит — к лучшему!
Re[4]: Синтаксис new - уточните
От: Lorenzo_LAMAS  
Дата: 06.08.03 09:46
Оценка:
Суть в том, что ты в некоторой сырой памяти таким образом полноценно конструируешь объект — т.е. все конструкторы всех базовых подобъектов и членов вызываются и т.д. Разумеется, памяти должно хватать и есть еще определенные ограничения.
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);                   // освобождение памяти
}
Re[4]: Синтаксис new - уточните
От: MaximE Великобритания  
Дата: 06.08.03 09:51
Оценка:
Здравствуйте, __Avatar__, Вы писали:

__A>К чему я это спросил: мне как раз нужно было чтобы объект создался по определенном адресу.

__A>То есть я понимаю, вышеописанными изощрениями, возможно запись объекта в определенный участок памяти?
__A>Но как работает такой метод если объект содержит виртуальные методы и само собой объекты родители?

Все чики-пики. Такой синтаксис называется placement new — синтаксис размещения объекта. Абсолютно безопасен (как и обыкновенный топор ), легален, стандартен и документирован.
Re[3]: Синтаксис new - уточните
От: __Avatar__ Украина  
Дата: 06.08.03 09:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
...
    qux->>~foo();                              // уничтожение объекта
А>    ::operator delete(baz);                   // освобождение памяти
А>

То есть при вызове деструктора объекта память не высвобождается?
Что же тогда происходит по вызову деструктора(кроме описанных действий внутри тела метода-деструктора)?
Все что ни происходит — к лучшему!
Re[4]: Синтаксис new - уточните
От: Аноним  
Дата: 06.08.03 10:00
Оценка:
Здравствуйте, __Avatar__, Вы писали:

__A>То есть при вызове деструктора объекта память не высвобождается?


При явном вызове деструктора — нет.

__A>Что же тогда происходит по вызову деструктора(кроме описанных действий внутри тела метода-деструктора)?


Ну, еще вызов деструкторов предков и подобъектов.
Re: Синтаксис new
От: bxMax Россия baxmax.narod.ru
Дата: 06.08.03 10:09
Оценка:
Спасибо друганы, первого ответа вполне достаточно!
Re: Синтаксис new
От: bxMax Россия baxmax.narod.ru
Дата: 06.08.03 10:24
Оценка:
А вообще, раз возникло столько споров о смысле мероприятия:
Создается массив объектов CArray
CArray *Arr=new CArray[size];
Насколько я понимаю, объекты остаються неинициализированными. Вот для того чтобы их инициализировать я и хочу вызывать placement new:
new(&Arr[n]) CArray();
Просто не хочеться выделять отдельно блоки памяти под каждый элемент.
Будет работать?
Re[2]: Синтаксис new
От: Bell Россия  
Дата: 06.08.03 10:33
Оценка: +1
Здравствуйте, 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, причем каждый из элементов этого массива — вполне нормальный, инициализированный объект, который в "дополнительной инициализации" не нуждается.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Синтаксис new
От: Lorenzo_LAMAS  
Дата: 06.08.03 10:38
Оценка:
Да, ты был прав и все даже хуже.
Of course, the code must be complete enough to compile and link.
Re[5]: Синтаксис new - уточните
От: __Avatar__ Украина  
Дата: 06.08.03 10:39
Оценка:
Здравствуйте, Аноним, Вы писали:

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


__A>>То есть при вызове деструктора объекта память не высвобождается?

А>При явном вызове деструктора — нет.

Таким образом память остается "не тронутой" и можно обращаться к элементам объекта?!
Я проверил: получается, что при явном вызове деструктора объекта, вызываются деструкторы его элементов(родителей тоже). Однако, если после этого вновь обратиться к элементам — можно с ними вполне нормально работать(скорее всего проиходит новое выделение памяти или что-то еще).
И даже после вызовы placement delete память под "активированные" элементы не высвобождается — утечка.
Все-так хотелось бы узнать специфику использвоание такого рода new и delete!
Все что ни происходит — к лучшему!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.