Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/26: Рейтинг темы: голосов - 26, средняя оценка - 4.92
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183

Перегрузка new и delete

03.08.2012, 15:53. Показов 5910. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста разобраться! Непонимаю примера из Т.А. Павловская "C/C++ Программирование на языке высокого уровня" для большей ясности цитирую


Перегрузка операции выделения памяти применяется для экономии памяти, повышения быстродействия программы или для размещения данных в некоторой конкретной области. Например, пусть описывается класс, содержащий указатель на некоторый объект:

C++
1
2
3
4
5
6
7
8
class Obj{...};
 
class pObj
{
    ...
    private:
        Obj *p;
};
При выделении памяти под объект типа pObj с помощью стандартной операции new

C++
1
pObj * p = new pObj;
фактическое количество байтов будет превышать sizeof(pObj), поскольку new обычно записывает в начало выделяемой области ее размер [2](для того чтобы правильно отрабатывала операции delete):

Для небольших объектов эти накладные расходы могут оказаться весьма значительными. Для экономии памяти можно написать собственную операцию new класса pObj, которая будет выделять большой блок памяти, а затем размещать в нем указатели на Obj. Для этого в объекте Obj вводится статическое поле headOfFree, в котором хранится указатель на первую свободную ячейку блока для размещения очередного объекта.

Неиспользуемые Ячейки связываются в список. Чтобы не занимать память под поле связи, используется объединение union:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class pObj
{
public: 
    static void * operator new (size_t size);
    private:
        union 
        {
            Obj * p;
            pObj * next;
        };
 
        static const int BLOCK_SIZE; 
        static pObj * headOfFree;
};
 
void * pObj::operator new(size_t size)
{
    //Перенаправить запросы неверного количества памяти стандартной операции new
    if(size != sizeof(pObj))
        return :: operator new (size);
    pObj * p = headOfFree; // указатель на первую свободную ячейку.
    //Переместить указатель списка свободных ячеек:
    if(p) headOfFree = p->next;
    //Если свободной памяти нет, выделяем очередной блок:
    else 
    {
        pObj * newblock = static_cast<pObj*>(::operator new(BLOCK_SIZE * sizeof(pObj)));
//Все ячейки свободны, кроме первой (она будет занята), связываем их
        for(int i = 1; i < BLOCK_SIZE - 1; i++)
            newblock[i].next = & newblock[i+1];
        newblock[BLOCK_SIZE - 1].next = 0;
        //Устанавливаем начало списка свободны ячеек:
        headOfFree = &newblock[1];
        p = newblock;
    }
 
    return p;
}
 
pObj * pObj::headOfFree;
const int pObj::BLOCK_SIZE = 1024;
Естественно, что если операция new перегружена, то же самое должно быть выполнено и для операции delete (например, в нашем случае стандартная операция delete не найдет в начале объекта верной информации о его размерах, что приведет к неопределенному поведению программы).

В рассмотренном примере операция delete должна добавлять освобожденную ячейку памяти к списку свободных ячеек:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void pObj::operator delete(void * ObjToDie, size_t size)
{
    if(ObjToDie == 0)return;
    if(size != sizeof(pObj))
    {
        ::operator delete(ObjToDie); 
        return;
    }
 
    pObj * p = static_cast<pObj * >(ObjToDie);
    p->next = headOfFree;
    headOfFree = p;
}
Т.А. Павловская "C/C++ Программирование на языке высокого уровня"
1. Так вообще кто-нибудь делает, часто, редко? в каких еще случах, кроме выше перечисленных...
2. Эту дополнительную информационную ячейку возвращает функция operator new? т.е. когда я выделяю в программе память:

C++
1
pObj * newblock = static_cast<pObj*>(::operator new(BLOCK_SIZE * sizeof(pObj)));
То выделяется BLOCK_SIZE * sizeof(pObj) + sizeof(unsigned int) байт? где область памяти размером sizeof(unsigned int) - для размещения информации о количестве байтов?

3. В данном примере экономия по памяти заключается в том, что все лишь одна такая ячейка будет выделена взамен 1024-ем? и поэтому в строке 30 в комментариях пишется //Все ячейки свободны, кроме первой (она будет занята). Т.е. будет занята информацией о количестве выделенной памяти?

4. Что будет когда мы впервый раз выделим область памяти

C++
1
pObj * p = new pObj;
Меня просто смущает, что в строке 36

C++
1
p = newblock;
присваивается самое начало этой области, т.е. &newblock[0], в то время как сказанно, что она занята...(стр. 30) (как я понял информационной часть или она ею все же не занята или чем она вообще занята?) и этот указатель возвращается из функции...т.е. указатель на занятую ячейку? Или что в этом комментарии подразумевалось?

5. И как эта область выделенная (BLOCK_SIZE*sizeof(pObj)) вообще освободится...ведь в переопределении operator delete нет никакого высвобождения памяти, а лишь перенаправление указателей в случае соответствия размеров????????

Добавлено через 6 минут
Расскажите поподробней как это все происходит, а то ничего не понятно...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.08.2012, 15:53
Ответы с готовыми решениями:

Перегрузка оператора new и delete
привет! подскажите, каким образом можно перегрузить операторы new и delete? заранее спасибо!

Перегрузка операторов new и delete
Перегрузить операторы new/new и delete/delete. Продемонстрировать их работу и работу размещающих операторов new / delete при разработке...

Перегрузка глобального оператора delete с параметрами
Столкнулся с проблемой при перегрузке оператора delete с параметрами: почему-то всегда вызывается не мой оператор, а стандартный. Вот...

31
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,564
03.08.2012, 16:37
Не по порядку отвечу. Всё нижеследующее на истину не претендует.

Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
1. Так вообще кто-нибудь делает, часто, редко? в каких еще случах, кроме выше перечисленных...
Делают.
1) Довольно часто на платформах, отличных от Винды, Линукса и т.д., требуется свой распределитель памяти, стандартный может не выполнять накладываемых на него требований.
2) Так же для некоторых классов может потребоваться выделение памяти не из кучи, а из пула или ещё как-нибудь, а хочется использовать единообразие при создании объектов. В этом случае тоже можно перегружать операторы new/delete.
3) Ну и самый простой случай - когда нужно запретить создание объектов по new/delete.

Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
присваивается самое начало этой области, т.е. &newblock[0], в то время как сказанно, что она занята...(стр. 30) (как я понял информационной часть или она ею все же не занята или чем она вообще занята?) и этот указатель возвращается из функции...т.е. указатель на занятую ячейку? Или что в этом комментарии подразумевалось?
Тут всё верно. Возвращается указатель на ту область памяти, куда разместился выделяемый объект. Собственно, этим объектом эта область и занята. А указатель на свободную ячейку устанавливается равным следующей области.

Кстати, подобный пример описан в книжке Александреску "Современное проектирование на С++". Книжка там совсем не об этом, но такой параграф там присутствует.

Добавлено через 3 минуты
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
4. Что будет когда мы впервый раз выделим область памяти
C++
1
pObj * p = new pObj;
В первый раз выделится память сразу под 1024 (BLOCK_SIZE) объектов. Потом будет просто возвращаться указатель на следующий свободный элемент.

Добавлено через 6 минут
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
2. Эту дополнительную информационную ячейку возвращает функция operator new?
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
5. И как эта область выделенная (BLOCK_SIZE*sizeof(pObj)) вообще освободится...ведь в переопределении operator delete нет никакого высвобождения памяти, а лишь перенаправление указателей в случае соответствия размеров?
Тут не гарантирую правильности совсем, но по идее при выделении памяти по new с указанием
размера никакой доп.ячейки не создаётся. Потому и в операции delete нет освобождения памяти. Память выделена один раз и используется для новых объектов. Когда удалятся все объекты, указатель станет равным значению самой первой области памяти.

Добавлено через 10 минут
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
3. В данном примере экономия по памяти заключается в том, что все лишь одна такая ячейка будет выделена взамен 1024-ем? и поэтому в строке 30 в комментариях пишется //Все ячейки свободны, кроме первой (она будет занята). Т.е. будет занята информацией о количестве выделенной памяти?
Да. Экономия не только в памяти, но и во времени исполнения. По сути стандартный new мы вызываем один раз, вместо тысячи двадцати четырёх раз. Все накладные расходы - это указатель на свободную область и константа размера блока, которые вообще статические.
0
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
03.08.2012, 16:58  [ТС]
что значит

Цитата Сообщение от John Prick Посмотреть сообщение
выделение памяти не из кучи, а из пула


Цитата Сообщение от John Prick Посмотреть сообщение
3) Ну и самый простой случай - когда нужно запретить создание объектов по new/delete.
-А можете привести пример как этот запрет реализуется?

Цитата Сообщение от John Prick Посмотреть сообщение
Возвращается указатель на ту область памяти, куда разместился выделяемый объект. Собственно, этим объектом эта область и занята. А указатель на свободную ячейку устанавливается равным следующей области.
- Ага, стормозил, спасибо.

Цитата Сообщение от John Prick Посмотреть сообщение
В первый раз выделится память сразу под 1024 (BLOCK_SIZE) объектов. Потом будет просто возвращаться указатель на следующий свободный элемент.
- т.е. оно вернет четко указатель на &newblock[0] без всяких доп. ячеек? ок...Т.е. когда вызывается стандартный new, то вызывается стандартный operator new, в котором выделяется поверх того размера, который необходим, для размещения объекта еще и информационная ячейка, а в нашем переопределенном operator new такой штуки нет и в этом вся фишка...?


Цитата Сообщение от John Prick Посмотреть сообщение
Когда удалятся все объекты, указатель станет равным значению самой первой области памяти.
- Ок. Ну а сама то область все равно остается захваченной? После выполнения программы ее уже освободить нельзя ведьбудет? или как...вот этот момент я как-то совсем не...

Добавлено через 10 минут
Цитата Сообщение от John Prick Посмотреть сообщение
По сути стандартный new мы вызываем один раз, вместо тысячи двадцати четырёх раз.
- так...стоп, я запутался...где мы, один раз, стандартный new вызываем? У меня просто при первом же вызове new, если в переопределяемой функции operator new поставить
C++
1
cout << "my operator new"
, выйдет это сообщение...

Добавлено через 1 минуту
или вы имеете ввиду в теле переопределяемой функции вызов ::operator new(BLOCK_SIZE * sizeof(pObj));?
0
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,564
03.08.2012, 17:08
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
что значит
выделение памяти не из кучи, а из пула
В общем случае по new память выделяется из так называемой "кучи" (heap). Т.е. из любого свободного места (это на самом деле не так, для простоты пишу). В случае пула (pool) память будет выделяться из заранее подготовленной области памяти. Что-то на подобие того, что сейчас рассматриваем.

Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
-А можете привести пример как этот запрет реализуется?
Нужно перегрузить операторы new и delete для класса и поместить их в секцию private. Тогда для объектов таких классов создать их с помощью new будет невозможно.
C++
1
2
3
4
5
6
class NotCreateWithNew
{
private:
    static void * operator new (size_t size);
    static void operator delete(void * pObjToDel, size_t size);
};
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
- Ок. Ну а сама то область все равно остается захваченной? После выполнения программы ее уже освободить нельзя ведьбудет? или как...вот этот момент я как-то совсем не...
Мы выделили память по new и запомнили её в статической переменной:
C++
1
2
3
pObj * newblock = static_cast<pObj*>(::operator new(BLOCK_SIZE * sizeof(pObj)));
//...
headOfFree = &newblock[1];
Когда дело дойдёт до удаления статических переменных (после окончания работы программы), тогда и должен удалиться этот указатель. Если честно, тут для меня тоже не очень ясный момент.

Добавлено через 3 минуты
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
- так...стоп, я запутался...где мы, один раз, стандартный new вызываем?
C++
1
pObj * newblock = static_cast<pObj*>(::operator new(BLOCK_SIZE * sizeof(pObj)));
Вот тут мы вызываем стандартный new. Это происходит только один раз для 1024 объектов. Потом, когда будет создаваться 1025й объект, снова будет вызван стандартный new.
Тут мы вызываем уже перегруженный new:
C++
1
pObj * p = new pObj;
1
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
03.08.2012, 17:24  [ТС]
т.е. пулом так же будет к примеру массив char'ов?

C++
1
2
char b[100];
int * p = new (b) int;
ок...

Цитата Сообщение от John Prick Посмотреть сообщение
Когда дело дойдёт до удаления статических переменных (после окончания работы программы), тогда и должен удалиться этот указатель.
- это проясняет немного, а вот это -

Цитата Сообщение от John Prick Посмотреть сообщение
Если честно, тут для меня тоже не очень ясный момент.
снова нет...



Цитата Сообщение от John Prick Посмотреть сообщение
...Вот тут мы вызываем стандартный new. Это происходит только один раз для 1024 объектов. Потом, когда будет создаваться 1025й объект, снова будет вызван стандартный new.
Тут мы вызываем уже перегруженный new:...
ок)

Хотелось бы более уверенный ответ про освобождение памяти)

Добавлено через 3 минуты
Огромное спасибо, за помощь)
0
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,564
03.08.2012, 17:28
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Хотелось бы более уверенный ответ про освобождение памяти)
А в этой книжке про это больше ничего не сказано? Возможно, что так и задумывалось, что память выделяется в программе нужное количество раз, но не освобождается никогда. У меня только такие мысли по этому поводу.
0
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
03.08.2012, 17:44  [ТС]
Нет, больше ничего не сказанно, что очень поразило, ибо во всех ост. разделах разжевывают все, а тут как-то совсем никак...
Цитата Сообщение от John Prick Посмотреть сообщение
Возможно, что так и задумывалось, что память выделяется в программе нужное количество раз, но не освобождается никогда.
- Если же программу достаточное количество раз использовать, то и от памяти ничего не останется...
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.08.2012, 19:17
Пример кода от Павловской - бред какой-то. Даже не знаю, как по другому назвать. Быдлокод хотя бы имеет под собой какую-то логику, но это даже быдлокодом не назовешь.

Не по теме:

К сожалению прямо сейчас не могу аргументировать свои слова. жена из-за компа гонит, сопротивлятся опасно:-[

0
Эксперт С++
 Аватар для nameless
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
03.08.2012, 19:24
Alberto_Timakov, лучше Мэйерса С. возьмите, почитайте. В его книге перегрузке new/delete, уделен раздел, с нормальными примерами, того когда целесообразно перегружать new/delete.
0
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
03.08.2012, 22:50  [ТС]
Kastaneda,
Цитата Сообщение от Kastaneda Посмотреть сообщение
но это даже быдлокодом не назовешь.
Как будет время, проаргументируйте пожалуйста...

И если есть представление того, как в данном примере освобождается память, я буду очень благодарен за ответ, мне интересно, а понять никак не могу...

Добавлено через 20 секунд
Цитата Сообщение от nameless Посмотреть сообщение
лучше Мэйерса С. возьмите, почитайте.
окейна=)

Добавлено через 2 минуты

Не по теме:

:jokingly:



Добавлено через 1 час 2 минуты
Цитата Сообщение от nameless Посмотреть сообщение
лучше Мэйерса С. возьмите, почитайте.
- читаю Мейерса, прочитал несколько правил, пока ничего нового, а пример у Павловской - сдут у С. Мейерса...так что там тоже самое... - один в один...может далее прояснится...
0
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,564
03.08.2012, 23:14
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Если же программу достаточное количество раз использовать, то и от памяти ничего не останется...
Ну это не так. Операционная система после завершения должна память очистить по-любому. Видимо, чтобы не вдаваться в детали, об освобождении памяти тактично умолчали. Кстати, в какой-то из книг (наверное Александреску, тот самый параграф про размещение в памяти маленьких объектов) как раз читал, что в книгах красочно расписывают подробности выделения памяти, но уходят от рассказов об её освобождении. Надо бы мне самому перечитать.
0
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
03.08.2012, 23:22  [ТС]
Цитата из Скота Мейерса "Эффективное использование C++" к вышенаписанному примеру, а именно к operator delete
Все это прекрасно, однако нас должны беспокоить возможные утечки памя-
ти. Вы не могли не заметить, что operator new из класса Airplane вызывает
: : operator new для выделения больших блоков памяти, a operator delete
ти блоки не высвобождает1. Утечка памяти! Утечка памяти! Мне кажется, я поч-
ти слышу звуки сигнальной сирены в вашей голове.
Обратите внимание: никакой утечки памяти пет.
Утечка возникает тогда, когда память выделяется, а затем вес указатели на нее
теряются. В таком случае она не может быть восстановлена иначе, как чисткой па-
мяти или другим внеязыковым механизмом. Но в данном случае утечка памяти
отсутствует, поскольку все указатели на память не теряются. Каждый большой
блок памяти «начале разбивается на порции размером объекта Airplane, а затем
эти порции помещаются в список свободных блоков. Когда пользователь вызы-
вает Airplane: : operator new, блоки удаляются из списка, и пользователь по-
лучает указатели на них. Когда пользователь вызывает operator delete, бло-
ки опять помещаются в список свободных блоков. При этом все блоки памяти
либо используются объектами Airplane (в этом случае за предотвращение
утечки памяти отвечает пользователь), либо находятся в списке свободных бло-
ков (в этом случае на блок памяти имеется указатель). Никакой утечки нет.
Однако блоки памяти, возвращаемые функцией : -. operator new, никогда не
высвобождаются функцией Airplane: : operator delete, и это явление долж-
но быть названо как-то особо. Такое название действительно существует: пул па-
мяти. Ксли хотите, можете считать это семантической эквилибристикой, но меж-
ду пулом и утечкой памяти существует важное различие. Утечка может расти до
бесконечности, даже если пользователи ведут себя правильно, а пул никогда не
превышает максимального количество памяти, запрошенного пользователем.
Но, я так и не понял...

Добавлено через 2 минуты
Ну, не понимаю, почему нет утечки памяти! Ведь, если мы запустим первый раз программу, то выделится одна область, после закроем программу, память ведь не освободится! откроем снова программу и память выделится другая! и т.д.! или...
0
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,564
03.08.2012, 23:32
Цитата Сообщение от nameless Посмотреть сообщение
лучше Мэйерса С. возьмите, почитайте. В его книге перегрузке new/delete, уделен раздел, с нормальными примерами, того когда целесообразно перегружать new/delete.
Безусловно, прочитать стоит. Только вопрос-то не в том, когда целесообразно применять эту перегрузку, а в том, как её реализовать. Говорит ли об этом Мейерс?

Добавлено через 4 минуты
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Ведь, если мы запустим первый раз программу, то выделится одна область, после закроем программу, память ведь не освободится! откроем снова программу и память выделится другая!
Нет. После закрытия программы память освободится.

Добавлено через 5 минут
Тут смысл в том, что эта область останется зарезервирована под выделение памяти только для объектов этого типа на всё время выполнения программы.
0
Эксперт С++
 Аватар для nameless
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
03.08.2012, 23:34
Цитата Сообщение от John Prick Посмотреть сообщение
олько вопрос-то не в том, когда целесообразно применять эту перегрузку, а в том, как её реализовать. Говорит ли об этом Мейерс?
Этому посвящено целое "правило". В котором говорится каких соглашений следует придерживаться при реализации собственных версий операторов new/delete.
0
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
04.08.2012, 00:28  [ТС]
Цитата Сообщение от John Prick Посмотреть сообщение
Нет. После закрытия программы память освободится.
- Она освободиться в данном случае ведь только из под указателя headOfFree, т.к. она есть static, а память выделенная new ведь уже динамическая...и следовательно не в статической памяти уже содержится...хотя и указывает на нее статическая переменная...Или по завершении программы, при автоматическом удалении headOfFree сначала что-то пойдет по адресу, который в нем содержится и высвободит память? Но как??? Если это все таки как-то так, то наверное должен тогда автоматически вызваться operator delete, но он здесь безнадежен, т.к. нет информационного блока... Или память и без delete освободиться??? В общем пока все как-то абракадабра=) или все намного проще? или все намного сложнее? В общем как...Можете написать псевдокод того как это происходит...
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
04.08.2012, 00:56
Всё гораздо проще: программа завершает работу — её память становится ничейной. ОС сообщает менеджеру виртуальной памяти, что такой-то процесс благополучно сдох и те куски памяти, что он выпросил для себя, можно спокойно раздавать другим процессам. Понятие «утечки памяти» имеет смысл только тогда, когда программа ещё работает.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
04.08.2012, 01:06
покажу на примере что такое утечка памяти
C++
1
2
3
4
int * var;
   for(int i=0;i<10;i++)
       var=new int;
delete var;
мы выделяем 10 блоков памяти а удаляем 1
при втором и последующем проходе в var заносится новые значения указателей а старые затираются
в результате удаляется только последний выделенный блок а 9 болтаются и до них никак нельзя достучатся
Но после выхода из программы(как уже было сказано)память очистится, об этом позаботится ОС
и если запустить программу 10 раз то в памяти будет болтаться не 90 а всего 9 блоков
в твоем примере указатель не затирается значит всегда есть возможность освободить память- это не утечка
0
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
04.08.2012, 02:46  [ТС]
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Всё гораздо проще: программа завершает работу — её память становится ничейной. ОС сообщает менеджеру виртуальной памяти, что такой-то процесс благополучно сдох и те куски памяти, что он выпросил для себя, можно спокойно раздавать другим процессам. Понятие «утечки памяти» имеет смысл только тогда, когда программа ещё работает.
ааа...понятно, ну тогда ладно! Всем спасибо!)
0
3 / 2 / 2
Регистрация: 14.12.2009
Сообщений: 149
09.12.2018, 22:29
У меня насчет этого примера другой вопрос.
В чем смысл этого примера? Ведь в нем член union это указатель либо на свободную ячейку, либо на обьект Obj, но как указатель на объект Obj в примере он никак не инициализируется. Нужно же еще укзателю p что-то присваивать. Либо new Obj, тогда выгода теряется, все равно каждый раз стандартный new вызывать. Либо адрес существующего статического объекта, тогда вообще легче объявить массив таких объетов и все.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
10.12.2018, 07:55
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Как будет время, проаргументируйте пожалуйста...
Да вроде все норм, я хз почему в 2012 году так написал, наверное потому что считал себя дохера умным

Не по теме:

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



Цитата Сообщение от Fatinho Посмотреть сообщение
тогда вообще легче объявить массив таких объетов и все.
Можно, но тогда сложность new/delete станет O(n), сейчас там сделано за O(1).

Еще раз на код глянул, профита от union что-то не вижу, вроде p даже не используется.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.12.2018, 07:55
Помогаю со студенческими работами здесь

Используя delete по указателю, возвращенному new [] или delete [] указателем, возвращаемым new
Помогите ответить на вопрос, не могу понять суть вопроса (правильно ли понимаю, что будет если выделить память в куче и затем не удалить...

В чем разница между delete и delete[]?
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete от delete, т.к. я попробовал...

Чем отличается delete[] от delete?
чем отличается? delete mas от delete mas

Delete или delete []
Здравствуйте. Написал программу которая создает динамический массив, заполняемый нулями и выводит адреса всех элементов на разных этапах...

delete[] *pointer vs. delete pointer и утечка памяти
Здравствуйте! Есть класс &quot;умного&quot; указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru