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

Поиск:

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


Эксперт
***


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

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



Тогда и мы вряд ли чем поможем smile


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


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


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

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



Цитата(Gelos @  1.5.2007,  18:10 Найти цитируемый пост)

В случае, если я просто вызываю оператор delete [] mass; 

а обязательно использовать эти ненадёжные new[]/delete[]'ы? 
контейнеры и smart pointerы не пойдут?

Цитата(Gelos @  2.5.2007,  02:13 Найти цитируемый пост)

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

Кстати. А утечка памяти происходит именно в этих циклах? 
А не в других ф-циях, вызываемых из этих циклов?

Это сообщение отредактировал(а) Mayk - 1.5.2007, 23:17


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


Новичок



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

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



Mayk

Функция одна. она же главная. Я не стал заводить множество функций под каждую операцию в проекте, хоть и признаю, что самым лучшим тоном было бы создать одну функцию, которую бы вызывал с разными параметрами. Ну да не будем переходить к специфике проекта самого.  
И... Как узнаю и научусь пользоваться контейнерами и smart pointerами  то обязательно сравню чем лучше. На данный момент, это для меня неизвестные термины. Все ещё впереди.

Xenon
Уже помогли. Причем достаточно сильно. Спасибо.
PM MAIL   Вверх
Vyacheslav
Дата 2.5.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Mayk @  1.5.2007,  22:52 Найти цитируемый пост)

а обязательно использовать эти ненадёжные new[]/delete[]'ы? 
контейнеры и smart pointerы не пойдут?

А где в стандарте описывается вероятность, с которой должен "ненадёжный" delete[] должен освобожать память выделенную "ненадёжным" new[]  smile 
И чем, простите, пользуются Ваши волшебные "контейнеры и smart pointerы", что бы  избежать этой ненадежности  smile    ?



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 2.5.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Vyacheslav @  2.5.2007,  13:37 Найти цитируемый пост)
А где в стандарте описывается вероятность, с которой должен "ненадёжный" delete[] должен освобожать память выделенную "ненадёжным" new[]   
И чем, простите, пользуются Ваши волшебные "контейнеры и smart pointerы", что бы  избежать этой ненадежности      ?


Пожалуй слово "ненадежный" надо употреблять к программеру.

Я так понял суть вопроса была в нехватке памяти. Где-то с год назад в другом формуе была похожая проблема. Весь вопрос был в том, что в процессе работы выделялось огромное количество небольших кусочков, потом освобождалось, потом снова выделялось. Я написал небольшой тест (сейчас найти его не смог). Программа только и делала, что выделяла и освобождала небольшие участки памяти. Стабильный вылет по нехватке памяти примерно через 10 минут работы. Естественно все корректно освобождалось - там ошибиться было негде.

Тогда все на форуме пришли к дружному мнению, что менеджер памяти в Борланде оказался не готов к таким вещам. Но чтобы это достичь, понадобилось действительно очень много раз выделять и освобождать много кусочков. А вот куда тестовый код дел - Бог его знает, видимо затер...
PM MAIL ICQ   Вверх
Mayk
Дата 2.5.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Vyacheslav @  2.5.2007,  17:37 Найти цитируемый пост)
smile 
И чем, простите, пользуются Ваши волшебные "контейнеры и smart pointerы", что бы  избежать этой ненадежности 

Извиняюсь за такую банальность --- деструкторами( которым обычные указатели, кстати, не могут похвастать).

Ненадежность пары new/delete заключается в том, что их надо писать руками. А если не напишешь --- то получишь memory leak. 

Контейнеры и смарт поинтеры умеют пытаются чистить память самостоятельно.  Зачастую довольно успешно.
Или я что-то пропустил и теперь без  явного my_vector.clear() память контейнеры уже не освобождают? user posted image

Цитата(Vyacheslav @  2.5.2007,  17:37 Найти цитируемый пост)

А где в стандарте описывается вероятность, с которой должен "ненадёжный" delete[] должен освобожать память выделенную "ненадёжным" new[]

А Вы видели код автора темы? Откуда такая уверенность что на каждый new[] имеется delete[]?

Это сообщение отредактировал(а) Mayk - 2.5.2007, 18:35


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


Новичок



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

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



Если память выделяется и освобождается внутри одной функции и еще размер массивов не очень большой то можете выделить ее в стеке. Это работает очень быстро и автоматом очищается. Например:
Код

void processingFunc (char* buffer, int size)
{
...
    // Допустим здесь надо выделить size * 10 байт памяти
    char tempBuffer [size * 10];
...
    // Дальше используем tempBuffer как хотим и при выходе из функции (даже из блока)
    // она автоматом освобождается.
}


Оператор new и delete не очень легкие операции. При частом использовании в некоторых случаях может провести к фрагментации адресного пространства процесса. Но этого (многократного создания и удаления) можно избежать, например таким образом:
Код

static char* tempBuffer = 0;
static int tempBufferSize = 0;

void processingFunc (char* buffer, int size)
{
    // Допустим здесь надо выделить size * 10 байт памяти
    int len = size * 10;

    if (len > tempBufferSize)
    {
        tempBufferSize = len;
        delete [] tempBuffer;
        tempBuffer = new char [tempBufferSize]
    }

    // Дальше используем tempBuffer как хотим,
    // освобождаем в конце работы программы
}


PM MAIL   Вверх
Earnest
Дата 2.5.2007, 19:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



А не ищете ли вы в темной комнате черную кошку которой там нет Откуда уверенность, что есть утечки? Менеджер процессов показывает только возрастание? Так он за такими мелочами, как отдельные кусочки в хипе не следит, хотя бы потому, что управление хипом может по разному происходить в разных программах. Кроме утечек есть ведь такая вещь, как фрагментация памяти... Т.е. выделенный объем хипа большой, а память в нем нарезана мелкими дольками: и свободной вроде много, и непрерывный кусок не найти...


--------------------
...
PM   Вверх
Vyacheslav
Дата 2.5.2007, 19:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Mayk @  2.5.2007,  18:28 Найти цитируемый пост)
Извиняюсь за такую банальность --- деструкторами( которым обычные указатели, кстати, не могут похвастать).

Ничего страшного, я Вас извиняю. Но продолжим дальше. А чем пользуются деструкторы, что осободить память? delete[] не предлагать в виду его "ненадежности" smile

Цитата(Mayk @  2.5.2007,  18:28 Найти цитируемый пост)
Ненадежность пары new/delete заключается в том, что их надо писать руками. А если не напишешь --- то получишь 

Валим с больной головы программиста на здоровую оператора ? В чем же виноват бедный оператор , если у программиста кривые ручки?

Цитата(Mayk @  2.5.2007,  18:28 Найти цитируемый пост)
Контейнеры и смарт поинтеры умеют пытаются чистить память самостоятельно.  Зачастую довольно успешно.
Или я что-то пропустил и теперь без  явного my_vector.clear() память контейнеры уже не освобождают? 


"Зачастую довольно успешно." Как ? И они тоже проявляют ненадежность?

Цитата(Mayk @  2.5.2007,  18:28 Найти цитируемый пост)
А Вы видели код автора темы? Откуда такая уверенность что на каждый new[] имеется delete[]?

Ну Вы тоже его не видели. Но даже если это и так, то я  считаю, что неправильно лечить кривизну рук применением   приемов и идиом программирования.  Ни на квалификации, ни на качестве кода это в конечном счете не скажется. Код останется таким же сомнительным.
Что же касается темы топика, то выскажу мысль о том, что судить об утечках основываясь на показаниях  менеджера процессов,  не кажется мне достаточно разумным. 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Mayk
Дата 2.5.2007, 20:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Vyacheslav @  2.5.2007,  23:54 Найти цитируемый пост)

Ничего страшного, я Вас извиняю. Но продолжим дальше. А чем пользуются деструкторы, что осободить память? delete[] не предлагать в виду его "ненадежности"

я ж уже написал что
Цитата(Mayk @  2.5.2007,  22:28 Найти цитируемый пост)

Ненадежность пары new/delete заключается в том, что их надо писать руками

Забыть вызвать деструкторы весьма проблематично. 
Забыть вызвать delete[]/free()/fclose/pthread_mutex_unlock/etc достаточно легко. Особенно в громоздкой ф-ции.

Цитата(Vyacheslav @  2.5.2007,  23:54 Найти цитируемый пост)

Валим с больной головы программиста на здоровую оператора ? В чем же виноват бедный оператор , если у программиста кривые ручки?

В неудобстве использования. 
Или Вы в самом деле считаете, что явный вызов delete[]  является  верхом удобства? 

Цитата(Vyacheslav @  2.5.2007,  23:54 Найти цитируемый пост)

"Зачастую довольно успешно." Как ? И они тоже проявляют ненадежность?

Поиск по ключевым словам "циклическая зависимость"(это о не абсолютной надежности смарт поинтеров)  и 
обдумывание vector<int*> mv(1, new int[100]); return; (это о не абсолютной надежности при использовании контейнеров)

Цитата(Vyacheslav @  2.5.2007,  23:54 Найти цитируемый пост)

Ну Вы тоже его не видели. Но даже если это и так, то я  считаю, что неправильно лечить кривизну рук применением   приемов и идиом программирования.  Ни на квалификации, ни на качестве кода это в конечном счете не скажется. Код останется таким же сомнительным.

Я оптимистично считаю, что 
а) недостаток опыта является временным явлением 
б) применение приемов и идиом программирования позволяет сократить кол-во потенциальных ошибок. 
(не говоря уже о том что изучение соответствующей литературы очень навряд ли скажется отрицательным образом на квалификации и качестве кода)

Цитата(Vyacheslav @  2.5.2007,  23:54 Найти цитируемый пост)

Что же касается темы топика, то выскажу мысль о том, что судить об утечках основываясь на показаниях  менеджера процессов,  не кажется мне достаточно разумным.  

К сожалению других данных у нас нет. Но лишний прогон через детекторы memory leak'ов хуже не сделает. 


Это сообщение отредактировал(а) Mayk - 2.5.2007, 20:49


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


Эксперт
***


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

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



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

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

возможно автар создал нечто вроде 

Код

    for(...)
    {
        int* p = new int[100];     // выделили

        for(...)
        {
            p = new int[100]; // еще выделили(старая еще торчит в памяти?) 
            delete [] p;
        }
        delete [] p;                // какой-нить UB
    }



хотя как оно было на самом деле мы уже вряд ли узнаем))




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


Explorer
****


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

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



Цитата(Mayk @  2.5.2007,  20:47 Найти цитируемый пост)
Забыть вызвать delete[]/free()/fclose/pthread_mutex_unlock/etc достаточно легко. Особенно в громоздкой ф-ции.

это проблемы программиста, он не должен забывать. 


--------------------
Мой блог
PM MAIL WWW   Вверх
Vyacheslav
Дата 2.5.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Mayk @  2.5.2007,  20:47 Найти цитируемый пост)
обдумывание vector<int*> mv(1, new int[100]); return; (это о не абсолютной надежности при использовании контейнеров

Вы знаете, Я в полной растеренности. Вы действительно уверены, что  vector предназначен для  только для того, чтобы уберечь неокрепшие души  начинающих программистов от написание ужасного delete? 
Потому как в этом коде, 
Код

vector<int*> mv(1, new int[100]); return

я вижу , как создается вектор указателей на инт размером 1  и тут же инициализируется адресом на массив, выделенный оператором new[]. Насколько я понимаю, здесь мы имеем возможность наблюдать  ту же кривизну рук. Почему Вы  это отнесли этот код к " не абсолютной надежности при использовании контейнеров" для меня загадка



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Mayk
Дата 2.5.2007, 21:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vinter @  3.5.2007,  01:16 Найти цитируемый пост)
Цитата(Mayk @  2.5.2007,  20:47 Найти цитируемый пост)
Забыть вызвать delete[]/free()/fclose/pthread_mutex_unlock/etc достаточно легко. Особенно в громоздкой ф-ции.
это проблемы программиста, он не должен забывать.  

угу, только удобства это не добавляет. RAII же эту проблему решает достаточно элегантно. 
я уже не помню когда в последний раз писал close() для закрытия файлов. 


Цитата(Vyacheslav @  3.5.2007,  01:16 Найти цитируемый пост)
Вы действительно уверены, что  vector предназначен для  только для того чтобы уберечь неокрепшие души  начинающих программистов от написание ужасного delete

Предоставьте ссылку на пост где я писал что он предназначен только для этого. 
 
Цитата(Vyacheslav @  3.5.2007,  01:16 Найти цитируемый пост)
Почему Вы  это отнесли этот код к " не абсолютной надежности при использовании контейнеров" для меня загадка

По определению
Цитата(http://dic.gramota.ru/search.php?word=%E0%E1%F1%EE%EB%FE%F2%ED%FB%E9&lop=x&gorb=x&efr=x&zar=x&ag=x&ab=x&lv=x&pe=x&az=x)

АБСОЛЮТНЫЙ прил.
2. Достигший высшего предела; полный, совершенный.

Наличие memory leak'ов свидетельствует о том, что код не является соврешенным, 
следовательно он не является абсолютно надёжным в плане памяти несмотря  несмотря на использование контейнера.
Напомню что это было к реплике
Цитата(Vyacheslav @  2.5.2007,  23:54 Найти цитируемый пост)

"Зачастую довольно успешно." Как ? И они тоже проявляют ненадежность?

Вот подобный пример как раз показывает когда stl'овские контейнеры проявляют ненадежность.

Для примера --- QPtrCollection из QT(это базовый тип для коллекций указателей) имеет свойство autoDelete, при установке которого элементы данного контейнера будут delete'нуты. (знаю-знаю, delete отличается от delete[] --- суть не в этом, суть в том что иногда контейнер вполне успешно может контролировать жить элементам, или нет).



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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Mayk
Vyacheslav,
я как-то упустила нить вашей дискуссии... Да и не только я, полагаю... smile
Вы оба правы: хорошему программисту STL контейнеры, RAII и прочая, конечно, не помешают, но плохому - не помогут...
Стоит только посмотреть (да хотя бы по этому форуму), ЧТО народ пытается в контейнеры засунуть... smile   
Кривые руки одним использованием STL не выпрямляются... Даже наоборот, появляется искусс и дальше ничего не понимать... Пороть надо, наверное... smile 


--------------------
...
PM   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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