Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
2 / 2 / 2
Регистрация: 31.07.2011
Сообщений: 143
1

Как работает оператор new?

15.12.2011, 19:57. Просмотров 3367. Ответов 13
Метки нет (Все метки)

Обязательно ли использовать оператор delete в коде (см.ниже.).После использования оператора new старая область память выделенная для pStr разве автоматически не затрётся?

Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//конструктор
CMyString::CMyString(){
        pStr=new char[1];
        *pStr=(char)0;
}
 
//функция изменяющая pStr
 
void CMyString::Set(char *pNewStr){
                      delete []pStr;                  
        pStr=new char[strlen(pNewStr)+1];
        Copy(pStr,pNewStr);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2011, 19:57
Ответы с готовыми решениями:

Как работает оператор if?
Народ! Операция сравнения возвращает ЧИСЛО, т.е. while и if принимают ЧИСЛО (0 - false, etc -...

Как работает оператор switch?
Shape* generator() { switch(rand() % 3) { case 0: return new Triangle; case 1: return new...

Как работает оператор typedef
как работает оператор typedef если есть у кого сам код то пришлите,интересно:)

Как работает тернарный оператор
Здравствуйте. Объясните, пожалуйста, что значит эта строка color = (color == 'W') ? 'B' : 'W';

13
В астрале
Эксперт С++
8021 / 4778 / 654
Регистрация: 24.06.2010
Сообщений: 10,547
15.12.2011, 20:01 2
ogcjm124, Нет. получим утечку
0
2 / 2 / 2
Регистрация: 31.07.2011
Сообщений: 143
15.12.2011, 20:43  [ТС] 3
Я был бы очень благодарен,если бы вы пояснили свой ответ
0
Каратель
Эксперт С++
6586 / 4007 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
15.12.2011, 20:54 4
ogcjm124, pStr указывает на начало выделенной памяти, вы затираете адрес начала старого блока, началом нового блока => старый блок уже никак не освободить, это может сделать только ОС
1
185 / 185 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
15.12.2011, 20:58 5
Старая память новой не затирается, потому что старая память еще остается занятой.
Но вот если старую память освободить оператором delete, то возможно при выделении памяти именно в это место выделиться память, но не факт. На это рассчитывать не стоит, да и не зачем.
1
172 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
16.12.2011, 17:38 6
Ммм вставлю и своих 5 коппек.
Уважаемый, ForEveR был прав. Вообще сколько есть new столько должно быть delete. Это есть закон который нельзя нарушать.
0
Эксперт С++
5012 / 2591 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
16.12.2011, 17:56 7
Цитата Сообщение от ogcjm124 Посмотреть сообщение
После использования оператора new старая область память выделенная для pStr разве автоматически не затрётся?
Если сильно утрировать, то можно сказать так. Оператор new помечает блок памяти как используемый. Оператор delete помечает блок памяти как свободный. Оператор new не может вернуть адрес уже используемого блока - никогда не может. Так вот, если был new, но не было delete, то некоторый блок навсегда останется "используемым". Что и называется утечкой памяти.
0
1 / 1 / 1
Регистрация: 16.12.2011
Сообщений: 15
16.12.2011, 19:48 8
new-определяет динамический массив, который в ходе роботы программы не изменяется и чтобы освободить этот массив после того, как он уже не будет нужен, используют delete, в результате программа будет меньше употреблять оперативной памяти.Просто для оптимизации приложения
0
Эксперт С++
5012 / 2591 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.12.2011, 10:54 9
Цитата Сообщение от besss2011 Посмотреть сообщение
Просто для оптимизации приложения
Правда? Я если delete не использовать, то ничего плохого видимо случится не может в принципе.
0
Evg
Эксперт CАвтор FAQ
21102 / 8119 / 628
Регистрация: 30.03.2009
Сообщений: 22,442
Записей в блоге: 30
17.12.2011, 12:11 10
Цитата Сообщение от fasked Посмотреть сообщение
Правда? Я если delete не использовать, то ничего плохого видимо случится не может в принципе.
Если программа потребляет много памяти и если память не освобождать, то рано или поздно упрёмся в то, что доступной памяти больше нет
0
fasked
17.12.2011, 12:46
  #11

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
Если программа потребляет много памяти и если память не освобождать, то рано или поздно упрёмся в то, что доступной памяти больше нет
Эм? Этот комментарий адресован в мою сторону? :)

0
Evg
17.12.2011, 13:11
  #12

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение
Этот комментарий адресован в мою сторону?
Комментарий касается фразы "в принципе" :)

0
fasked
17.12.2011, 13:29
  #13

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
Комментарий касается фразы "в принципе"
В моей фразе не хватало таблички "сарказм" :)

0
Evg
17.12.2011, 13:35     Как работает оператор new?
  #14

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение

Не по теме:


В моей фразе не хватало таблички "сарказм" :)

Ну вот после таких фраз без табличек и начинают люди кривые коды писать. И потом всем доказывать "а мне вот на форуме сказали"

1
17.12.2011, 13:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2011, 13:35
Привет! Вот еще темы с ответами:

Как работает оператор char *?
Как работает оператор char *! Можете описать его принцип работы! Спасибо заранее!

Как работает оператор new, он же _Znwj на асме
Собственно как действительно он работает? То есть что реально происходит какие инструкции (грубо...

Как работает оператор cout и return?
Допустим есть функция: int show() { int g = 5; cout << (g>7)?1:2; return...

Уточнение о том как работает оператор for
Я правильно понимаю? Оператор for, сперва будет работать только с первым выражением до тех пор,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.