Форум программистов, компьютерный форум CyberForum.ru

Перегрузка new и delete - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
03.08.2012, 15:53     Перегрузка new и delete #1
Помогите пожалуйста разобраться! Непонимаю примера из Т.А. Павловская "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 минут
Расскажите поподробней как это все происходит, а то ничего не понятно...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2012, 15:53     Перегрузка new и delete
Посмотрите здесь:

C++ new delete
Перегрузка оператора new и delete C++
C++ В чем разница между delete и delete[]?
Чем отличается delete[] от delete? C++
C++ new и delete
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
03.08.2012, 16:37     Перегрузка new и delete #2
Не по порядку отвечу. Всё нижеследующее на истину не претендует.

Цитата Сообщение от 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 мы вызываем один раз, вместо тысячи двадцати четырёх раз. Все накладные расходы - это указатель на свободную область и константа размера блока, которые вообще статические.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
03.08.2012, 16:58  [ТС]     Перегрузка new и delete #3
что значит

Цитата Сообщение от 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));?
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
03.08.2012, 17:08     Перегрузка new и delete #4
Цитата Сообщение от 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;
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
03.08.2012, 17:24  [ТС]     Перегрузка new и delete #5
т.е. пулом так же будет к примеру массив char'ов?

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

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

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



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

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

Добавлено через 3 минуты
Огромное спасибо, за помощь)
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
03.08.2012, 17:28     Перегрузка new и delete #6
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Хотелось бы более уверенный ответ про освобождение памяти)
А в этой книжке про это больше ничего не сказано? Возможно, что так и задумывалось, что память выделяется в программе нужное количество раз, но не освобождается никогда. У меня только такие мысли по этому поводу.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
03.08.2012, 17:44  [ТС]     Перегрузка new и delete #7
Нет, больше ничего не сказанно, что очень поразило, ибо во всех ост. разделах разжевывают все, а тут как-то совсем никак...
Цитата Сообщение от John Prick Посмотреть сообщение
Возможно, что так и задумывалось, что память выделяется в программе нужное количество раз, но не освобождается никогда.
- Если же программу достаточное количество раз использовать, то и от памяти ничего не останется...
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
03.08.2012, 19:17     Перегрузка new и delete #8
Пример кода от Павловской - бред какой-то. Даже не знаю, как по другому назвать. Быдлокод хотя бы имеет под собой какую-то логику, но это даже быдлокодом не назовешь.

Не по теме:

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

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

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

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

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

Не по теме:



Добавлено через 1 час 2 минуты
Цитата Сообщение от nameless Посмотреть сообщение
лучше Мэйерса С. возьмите, почитайте.
- читаю Мейерса, прочитал несколько правил, пока ничего нового, а пример у Павловской - сдут у С. Мейерса...так что там тоже самое... - один в один...может далее прояснится...
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
03.08.2012, 23:14     Перегрузка new и delete #11
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Если же программу достаточное количество раз использовать, то и от памяти ничего не останется...
Ну это не так. Операционная система после завершения должна память очистить по-любому. Видимо, чтобы не вдаваться в детали, об освобождении памяти тактично умолчали. Кстати, в какой-то из книг (наверное Александреску, тот самый параграф про размещение в памяти маленьких объектов) как раз читал, что в книгах красочно расписывают подробности выделения памяти, но уходят от рассказов об её освобождении. Надо бы мне самому перечитать.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
03.08.2012, 23:22  [ТС]     Перегрузка new и delete #12
Цитата из Скота Мейерса "Эффективное использование 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 минуты
Ну, не понимаю, почему нет утечки памяти! Ведь, если мы запустим первый раз программу, то выделится одна область, после закроем программу, память ведь не освободится! откроем снова программу и память выделится другая! и т.д.! или...
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
03.08.2012, 23:32     Перегрузка new и delete #13
Цитата Сообщение от nameless Посмотреть сообщение
лучше Мэйерса С. возьмите, почитайте. В его книге перегрузке new/delete, уделен раздел, с нормальными примерами, того когда целесообразно перегружать new/delete.
Безусловно, прочитать стоит. Только вопрос-то не в том, когда целесообразно применять эту перегрузку, а в том, как её реализовать. Говорит ли об этом Мейерс?

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

Добавлено через 5 минут
Тут смысл в том, что эта область останется зарезервирована под выделение памяти только для объектов этого типа на всё время выполнения программы.
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
03.08.2012, 23:34     Перегрузка new и delete #14
Цитата Сообщение от John Prick Посмотреть сообщение
олько вопрос-то не в том, когда целесообразно применять эту перегрузку, а в том, как её реализовать. Говорит ли об этом Мейерс?
Этому посвящено целое "правило". В котором говорится каких соглашений следует придерживаться при реализации собственных версий операторов new/delete.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
04.08.2012, 00:28  [ТС]     Перегрузка new и delete #15
Цитата Сообщение от John Prick Посмотреть сообщение
Нет. После закрытия программы память освободится.
- Она освободиться в данном случае ведь только из под указателя headOfFree, т.к. она есть static, а память выделенная new ведь уже динамическая...и следовательно не в статической памяти уже содержится...хотя и указывает на нее статическая переменная...Или по завершении программы, при автоматическом удалении headOfFree сначала что-то пойдет по адресу, который в нем содержится и высвободит память? Но как??? Если это все таки как-то так, то наверное должен тогда автоматически вызваться operator delete, но он здесь безнадежен, т.к. нет информационного блока... Или память и без delete освободиться??? В общем пока все как-то абракадабра=) или все намного проще? или все намного сложнее? В общем как...Можете написать псевдокод того как это происходит...
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.08.2012, 00:56     Перегрузка new и delete #16
Всё гораздо проще: программа завершает работу — её память становится ничейной. ОС сообщает менеджеру виртуальной памяти, что такой-то процесс благополучно сдох и те куски памяти, что он выпросил для себя, можно спокойно раздавать другим процессам. Понятие «утечки памяти» имеет смысл только тогда, когда программа ещё работает.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
04.08.2012, 01:06     Перегрузка new и delete #17
покажу на примере что такое утечка памяти
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 блоков
в твоем примере указатель не затирается значит всегда есть возможность освободить память- это не утечка
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2012, 02:46     Перегрузка new и delete
Еще ссылки по теме:

C++ delete this
C++ Перегрузка глобального оператора delete с параметрами
New/Delete C++

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

Или воспользуйтесь поиском по форуму:
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
04.08.2012, 02:46  [ТС]     Перегрузка new и delete #18
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Всё гораздо проще: программа завершает работу — её память становится ничейной. ОС сообщает менеджеру виртуальной памяти, что такой-то процесс благополучно сдох и те куски памяти, что он выпросил для себя, можно спокойно раздавать другим процессам. Понятие «утечки памяти» имеет смысл только тогда, когда программа ещё работает.
ааа...понятно, ну тогда ладно! Всем спасибо!)
Yandex
Объявления
04.08.2012, 02:46     Перегрузка new и delete
Ответ Создать тему
Опции темы

Текущее время: 08:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru