The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"delete или free?"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"delete или free?"  
Сообщение от Дмитрий email(??) on 23-Мрт-07, 19:17 
hi!

И есче вопросик.

size_t size=10;
char *buf=new char [size];

Всю жизнь был уверен что

delete buf;

равносильно

free(buf);

Так ли это? Сильно усомнился в этом после трасировки программы через vilgrind. Объясните пожалуйста этот момент.

Очень благодарен.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "delete или free?"  
Сообщение от phpcoder (??) on 23-Мрт-07, 19:24 
Не равносильно  и даже, кажется, является ошибкой. Используйте free() для освобождения памяти от malloc() и delete для освобождения памяти, выделенной с помощью new.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "delete или free?"  
Сообщение от Дмитрий email(??) on 23-Мрт-07, 19:40 
>Не равносильно  и даже, кажется, является ошибкой. Используйте free() для освобождения
>памяти от malloc() и delete для освобождения памяти, выделенной с помощью
>new.


Дык эта же программуля мне сказала что в приведенном мною случае необходимо как раз таки использовать free !!!!!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "delete или free?"  
Сообщение от Ф on 23-Мрт-07, 20:41 
>Дык эта же программуля мне сказала что в приведенном мною случае необходимо
>как раз таки использовать free !!!!!

а программа не сказала, что надо делать так

delete [] buf;

а?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "delete или free?"  
Сообщение от smb on 23-Мрт-07, 20:44 
>>Не равносильно  и даже, кажется, является ошибкой. Используйте free() для освобождения
>>памяти от malloc() и delete для освобождения памяти, выделенной с помощью
>>new.
>
>
>Дык эта же программуля мне сказала что в приведенном мною случае необходимо
>как раз таки использовать free !!!!!

В данном случае это в теории эквивалентно...

Но лучше при Type* var = new Type [x]; использовать delete[] var; в случае собственного типа - это приведет к вызову деструктора для каждого элемента массива. В данном случае, очевидно, всё равно :) Общий совет был уже дан выше, и он совершенно правильный.

Программуля - засунь её разработчику в одно место с такими советами ;)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "delete или free?"  
Сообщение от Дмитрий email(??) on 23-Мрт-07, 20:49 
>>>Не равносильно  и даже, кажется, является ошибкой. Используйте free() для освобождения
>>>памяти от malloc() и delete для освобождения памяти, выделенной с помощью
>>>new.
>>
>>
>>Дык эта же программуля мне сказала что в приведенном мною случае необходимо
>>как раз таки использовать free !!!!!
>
>В данном случае это в теории эквивалентно...
>
>Но лучше при Type* var = new Type [x]; использовать delete[] var;
По примеру Страустрапа конкретно в этом случае, если я не ошибаюсь, надо использовать delete а не delete[].

>в случае собственного типа - это приведет к вызову деструктора для
>каждого элемента массива. В данном случае, очевидно, всё равно :) Общий
>совет был уже дан выше, и он совершенно правильный.
>
>Программуля - засунь её разработчику в одно место с такими советами ;)
>


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

И когда я сделал (конкретно в указанном случае) free то программа перстала удерживать память, которую я вижу в top как cached memory (вопрос об этом я задавал здесь ранее).
Так что честь и хвала разработчикам этой программы :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "delete или free?"  
Сообщение от Ф on 23-Мрт-07, 22:15 
Если сишная функция — malloc,calloc,strdup — то очищай через free.
Если new — то delete
Если new[] — то delete[].

Скорее всего, new реализован поверх malloc, поэтому пара new-free приведет, может быть, лишь только к невызову деструкторов.

Надо понимать, что new - оператор языка, free - библиотечная функция.

Есть стандарты языка, а есть реализация языка. То что в стандарте работает всегда, а то что в реализации может однажды не сработать (реализуют, например, new не через malloc) - для тебя это будет очень большая головная боль.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "delete или free?"  
Сообщение от smb on 24-Мрт-07, 02:03 
>>>>Не равносильно  и даже, кажется, является ошибкой. Используйте free() для освобождения
>>>>памяти от malloc() и delete для освобождения памяти, выделенной с помощью
>>>>new.
>>>
>>>
>>>Дык эта же программуля мне сказала что в приведенном мною случае необходимо
>>>как раз таки использовать free !!!!!
>>
>>В данном случае это в теории эквивалентно...
>>
>>Но лучше при Type* var = new Type [x]; использовать delete[] var;
>По примеру Страустрапа конкретно в этом случае, если я не ошибаюсь, надо
>использовать delete а не delete[].
По примеру всё того же Страуструпа, $6.2.6.1. "Массивы" -> delete[] =)

>>в случае собственного типа - это приведет к вызову деструктора для
>>каждого элемента массива. В данном случае, очевидно, всё равно :) Общий
>>совет был уже дан выше, и он совершенно правильный.
>>
>>Программуля - засунь её разработчику в одно место с такими советами ;)
>>
>
>
>Программа выдавала предупреждение, что использовано delete ИЛИ delete[] вместо free и указывала
>место где был new.
>
>И когда я сделал (конкретно в указанном случае) free то программа перстала
>удерживать память, которую я вижу в top как cached memory (вопрос
>об этом я задавал здесь ранее).
>Так что честь и хвала разработчикам этой программы :)
Честь и хвала - это хорошо, но всё тот же Страуструп говорит: "Например, размещать объект при помощи new, а уничтожать при помощи free() означает напрашиваться на неприятность."
Как уже говорилось, в данном случае объекта нету(есть char-ы) и в теории и довольно часто на практике можно употребить free(), если есть на то воля ваша и программа при этом работает. Но помните про возможные неприятности....:) А точнее, о них должны помнить разработчики этой программы, и в первую очередь именно поэтому непонятен их совет.

Это с точки зрения языка, стандарта и всего прочего :)
В чем ошибка/странное поведение данной конкретной реализации(с которой вы работаете) стандарта - не могу знать, вестимо, дело в аллокаторе памяти, используемом new...

Удачи в разработках!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "delete или free?"  
Сообщение от Дмитрий email(??) on 24-Мрт-07, 09:31 
Спасибо всем, кто откликнулся за ваши ценные советы!!!
В общих чертах решение прояснилось. Еще раз спасибо!

Желаю всем удачи!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "delete или free?"  
Сообщение от NoName email on 20-Авг-07, 12:19 
люди, помогите с такой ситуацией.
у меня есть структура
struct Name
{
data
...
Name* Next;
Name* Prev;
}

есть указатель на нее Name* pName;

искользую delete pName;
но в отладчике структура все равно остается, уничтожается только самое первое поле в data (а верней, превращается в абракадабру)

что это может быть?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "delete или free?"  
Сообщение от dimonna email(ok) on 20-Авг-07, 12:31 
>[оверквотинг удален]
>Name* Prev;
>}
>
>есть указатель на нее Name* pName;
>
>искользую delete pName;
>но в отладчике структура все равно остается, уничтожается только самое первое поле
>в data (а верней, превращается в абракадабру)
>
>что это может быть?

После удаления блока памяти обнуляйте указатель:
delete pName;
pName=NULL;

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2023 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру