Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа оператора delete[] 
:(
    Опции темы
Gelos
Дата 1.5.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 29.4.2007

Репутация: нет
Всего: нет



Прочитал темы посвещенные данному оператору, но то что интересует не нашел.  

В случае, если я просто вызываю оператор delete [] mass;  то соотвественно , все что было в этой памяти уничтожается, но что происходит с памятью? У меня есть подозрение, что освобожденная память не возвращается обратно в систему. А дальше по циклу, я снова выделяю память, по этому же указателю, и так пока программа не съедает все виртуальную память на машине, и благополучно умирает. Сегодня наткнулся на запись в книге, что, для того чтобы освобожденная память была возвращена в систему, оператор delete помещается в деструктор.  Так ли это?  или в любом случае , освобожденная память возвращается в систему?
PM MAIL   Вверх
sergejzr
Дата 1.5.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



"Возвращается" конечно. Освобождённые блоки помечаются свободными и будут использованы при первом удобном случае.
А с чем связано подозрение?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Xenon
Дата 1.5.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Память выделенную с new T удаяешь при помощи delete pTr, а new T[] удаляешь delete [] pTr. Если попытаешься стереть то, что выделил с new [] простым delete, то получишь UB. 
И что значит не возвращаться в память? При вызове delete вызывается деструктор, а потом free, который освобождает память.


--------------------
user posted image  
PM MAIL   Вверх
Gelos
Дата 1.5.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 29.4.2007

Репутация: нет
Всего: нет



Подозрение связано с тем, что очень хорошо в диспетчере задач видно , как программа выедает память. При отладке в дебагере видно, что данные уничтожаются. И тем не менее, память исчезает. Поэтому и возникла мысль, что освобожденная память так и остается освобожденной областью памяти, в которой ничего нет, а на следующей итерации цикла, где снова вызывается оператор new память опять выделяется, и данные записываются в неё, а не в ту ранее освобожденную область .
PM MAIL   Вверх
Romikgy
Дата 1.5.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



имхо где то есть участок кода где есть выделение памяти , но нет освобождения


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Gelos
Дата 1.5.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 29.4.2007

Репутация: нет
Всего: нет



Romikgy,
ладно... придется дальше  искать.

Значит, при операторе delete память "возвращается   в общий кусок" а не остается висеть в пространстве пустой областью просто занимающей место. Так?
PM MAIL   Вверх
Romikgy
Дата 1.5.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Gelos @  1.5.2007,  14:00 Найти цитируемый пост)
Так?

так


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
archimed7592
Дата 1.5.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Gelos @  1.5.2007,  14:10 Найти цитируемый пост)
Сегодня наткнулся на запись в книге, что, для того чтобы освобожденная память была возвращена в систему, оператор delete помещается в деструктор.
вот что имелось в виду
Код
class A
{
    int *p;
public:
    A ()
        : p (new int [100])
    {
    }
    ~A ()
    {
        delete [] p; // если эту строку закоментировать, то будут утечки
    }
};

int main ()
{
    while (true)
    {
        A *pa = new A [100];
        delete [] pa;
    }
    return 0;
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Rockie
Дата 1.5.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Gelos @  1.5.2007,  15:00 Найти цитируемый пост)
ладно... придется дальше  искать.Значит, при операторе delete память "возвращается   в общий кусок" а не остается висеть в пространстве пустой областью просто занимающей место. Так?

Gelos, покажи код, а то так ты можешь еще очень долго выяснять 





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Mayk
Дата 1.5.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Gelos @  1.5.2007,  18:10 Найти цитируемый пост)
А дальше по циклу, я снова выделяю память, по этому же указателю, и так пока программа не съедает все виртуальную память на машине, и благополучно умирае

Найди какой-нибудь инструмент, отлавливающий memory-leak'и.

Или свой напиши --- перегружаешь операторы new и delete, при вызове new записываешь куда-либо что было выделение. При вызове delete'ов затираешь что было выделение. В конце работы выводишь какие участки памяти не были освобождены. 




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Gelos
Дата 1.5.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 29.4.2007

Репутация: нет
Всего: нет



Rockie
Код проекта уже весьма большой, поэтому приводить не имеет смысла. 


Mayk
Спасибо, возьму на заметку. хорошая идея..
PM MAIL   Вверх
Rockie
Дата 1.5.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



а, блин smile)

Цитата(Gelos @  1.5.2007,  14:10 Найти цитируемый пост)
 А дальше по циклу, я снова выделяю память, по этому же указателю

Семен Семеныч.. smile

Добавлено через 4 минуты и 4 секунды
Gelos, ты выделяешь память в цикле, но навряд ли там же освобождаешь. В итоге память выделяется, не удаляется и снова выделяется. Поэтому программа жрет память, что и должна делать smile new и delete должны вместе находиться в цикле.






--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Gelos
Дата 1.5.2007, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 29.4.2007

Репутация: нет
Всего: нет



Rockie
ну щаз ) как же. в обоих циклах, как в главном так и вложенном память выделяется и там же уничтожается.  smile 
PM MAIL   Вверх
Rockie
Дата 1.5.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Gelos @  1.5.2007,  20:18 Найти цитируемый пост)
в обоих циклах, как в главном так и вложенном память выделяется и там же уничтожается.  smile   


Gelos, чего ты жадничаешь? покажи функцию с этими циклами))




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Gelos
Дата 1.5.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 29.4.2007

Репутация: нет
Всего: нет



Rockie
кхе....
Да дело не в жадности. Просто весь проект взаимосвязан. Я не могу от туда взять кусок, и и показать. Мол тут  непонятно. А  выкладывать весь код, я редактировать устану. 

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1026 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.