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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Совместное использование new/delete и malloc/free 
:(
    Опции темы
zzkoderzzzx
Дата 16.10.2013, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне кажется, что эти методы имеют ряд преимуществ и недостатков относительно друг друга.
 
Например для удаления массива надо написать delete [], а delete удалит только первый его элемент. Это часто приводит к ошибкам.
В то же время, free одинаково удалит как массив так и просто указатель.

В то же время, new намного удобнее malloc, т.к. нет необходимости определять размер в байтах и приводить к нужному типу.

Поэтому мне кажется удобным выделять память с помощью new, а освобождать с помощью free.

Какие могут быть проблемы при таком подходе?
PM MAIL   Вверх
vinter
Дата 16.10.2013, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



память выделенная посредством new может быть освобождена только посредством вызова delete. Так что Ваша идея провалилась, так делать нельзя.


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


Новичок



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

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



А я делал и программа работала.

Это сообщение отредактировал(а) zzkoderzzzx - 16.10.2013, 11:15
PM MAIL   Вверх
vinter
Дата 16.10.2013, 11:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



malloc/free всего лишь аллокаторы памяти. Т.е. они выделяют память и освобождают оную, безотносительно типов.
new/delete это конструкции языка C++, которые помимо выделения\освобождения памяти еще вызывают конструкторы и деструкторы объектов. Чаще всего выделение памяти в new сделано через malloc, а освобождение в delete через free. Но, во-первых, тут нет никакой гарантии, во-вторых: кто вызовет деструктор, если освободить память выделенную new посредством free?

Раз уж Вы программируете на C++ запомните правило: если программа работает, это не значит, что она работает корректно. И еще одно: если программа работает корректно, это не значит, что нет утечек памяти.


--------------------
Мой блог
PM MAIL WWW   Вверх
bsa
Дата 16.10.2013, 11:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(zzkoderzzzx @  16.10.2013,  11:59 Найти цитируемый пост)
Например для удаления массива надо написать delete [], а delete удалит только первый его элемент. Это часто приводит к ошибкам.
Не совсем так. delete вызовет деструктор первого элемента и попытается освободить память. Когда память выделяется с помощью new[], то может быть выделено чуть больше памяти (в начале блока, результат new[] смещается относительно этой дополнительной памяти), чем надо, для хранения количества элементов (это чтобы delete[] правильно отработал). таким образом, delete[] не только вызывает деструкторы всех элементов массива, но еще и корректно освобождает память.
free использовать нельзя после new, так как он не вызывает деструкторы по определению. Это ведет к утечкам. Более того, если память была выделена с помощью new[], то результат вообще непредсказуем, так как free ничего не знает о возможном резерве в начале блока.
К тому же, возможна ситуация, что оператор new был переопределен для какого-то типа и использует особый метод размещения в памяти, таким образом, используя неверный оператор освобождения памяти ты спровоцируешь неопределенное поведение программы.

Поэтому, если ты выделил с помощью new, то освобождать должен только с помощью delete. Тоже самое касается и new[]/delete[], и malloc/calloc/free, и прочих аллокаторов.
PM   Вверх
zzkoderzzzx
Дата 16.10.2013, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А зачем ввели 2 разных оператора delete и delete[]? 

Т.е. почему delete не удаляет все объекты, выделенные с помощью new[]?

Очевидно, что удаление только первого элемента массива нужно очень редко, и может быть реализовано отдельно без специального оператора.
PM MAIL   Вверх
vinter
Дата 16.10.2013, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



delete удаляет объект, delete[] удаляет массив объектов. Это разные случаи и требует разного подхода ни один не является частным случаем другого.


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


Новичок



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

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



Когда массив объектов удаляется с помощью delete не выдается даже предупреждение, хотя скорее всего это ошибка программиста.
PM MAIL   Вверх
vinter
Дата 16.10.2013, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



а какое может быть предупреждение? Откуда компилятору знать, что там лежит по указателю? 


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


Эксперт
****


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

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



Цитата(bsa @  16.10.2013,  11:26 Найти цитируемый пост)
free использовать нельзя после new, так как он не вызывает деструкторы по определению

и вообще, хотя на практике new/delete обычно реализуются при помощи malloc/free (или обе пары при помощи одного механизма), никакой гарантии что они выделяют память совместимо нет (и даже что они могут работать с одним диапазоном адресов)
PM MAIL   Вверх
bsa
Дата 16.10.2013, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(zzkoderzzzx @  16.10.2013,  12:41 Найти цитируемый пост)
Очевидно, что удаление только первого элемента массива нужно очень редко, и может быть реализовано отдельно без специального оператора. 
Ты сильно ошибаешься. Например, выделение массивов в моих программах вообще нет - я пользуюсь std::vector и пр. контейнерами (у них механизм выделения памяти несколько отличается от банального new Object[N]). А вот создание динамических объектов вне массивов очень активно используется.
PM   Вверх
o2n3e
Дата 16.10.2013, 14:16 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

PM MAIL   Вверх
zzkoderzzzx
Дата 16.10.2013, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Ключевое слово new/delete - это отдельнай часть языка, которая к памяти не имеет никакого отношения. Она просто заменяет delete p; на p->~p();


А как делается new/delete базовых типов, у которых нет конструктора и деструктора?
PM MAIL   Вверх
baldina
Дата 16.10.2013, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(zzkoderzzzx @  16.10.2013,  14:24 Найти цитируемый пост)
у которых нет конструктора и деструктора

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

Добавлено через 7 минут и 1 секунду
вот например
PM MAIL   Вверх
zzkoderzzzx
Дата 16.10.2013, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(baldina @ 16.10.2013,  14:32)
конструктор и деструктор есть всегда.

Такой код у меня дает ошибку
Код

int i=int();
или
Код

int i();

Как вызвать конструктор класса int?
PM MAIL   Вверх
baldina
Дата 16.10.2013, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



второе - объявление функции без параметров возвращающей int. тут скобки не нужны, вызовется конструктор без параметров.
а первое - компилятор обнови
http://ideone.com/hturq2

PM MAIL   Вверх
zzkoderzzzx
Дата 16.10.2013, 15:33 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



c++11 это уже не с++, а очередной С-подобный язык.
не понятно как в обычном с++ реализован вызов конструкторов/деструкторов в new/delete, раз для базовых типов это ошибка.

Это сообщение отредактировал(а) zzkoderzzzx - 16.10.2013, 15:35
PM MAIL   Вверх
baldina
Дата 16.10.2013, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



никакой ошибки нет.
Код

typedef int Int;
Int().~Int();

будет выполнятся везде. так что это чисто синтаксические особенности, которые к наличию конструктора не относятся (понятно, что на самом деле у встроенных типов конструкторов нет, в смысле - они пустые. но семантически они есть всегда)
Цитата(zzkoderzzzx @  16.10.2013,  15:33 Найти цитируемый пост)
c++11 это уже не с++

с++ это то, что описано в стандарте

Добавлено через 2 минуты и 12 секунд
кстати насчет "истинного С++"
http://codepad.org/3OO9pCHz
PM MAIL   Вверх
o2n3e
Дата 16.10.2013, 17:17 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

PM MAIL   Вверх
akizelokro
Дата 16.10.2013, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата(o2n3e @  16.10.2013,  17:17 Найти цитируемый пост)
жава, которая имеет тысячи нюансов, если жава для идиотов, а нюансы отпугивают и не совместимы ...


Я знал, что это начнётся, и в теме по С++ начнутся вопросы и жалобы по другим языкам программирования.
А вот!



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
baldina
Дата 16.10.2013, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



реальные поцаны юзают фартран
PM MAIL   Вверх
EgoBrain
Дата 17.10.2013, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Блин, агитации o2n3e начинают на меня потихоньку действовать, он вскрывает недостатки о которых сам не задумываешься. Я до этого все узнаваемые нюансы и сложности с++ воспринимал как должное, как естественную природу вещей, но теперь начал задумываться "а как бы было если бы этого не было", согласен с 
Цитата
Т.е. для всех базовых типов в С++ есть кастыли, при помощи которых горепрограммист их может юзать как классы.
, как то оно в с++ не очень смотрится, C#повское оно.

По теме.
Писали что free освобождает память выделенную под объект, а new помимо этого вызывает деструктор. Так вот что включено в память выделенную под объект, разве не все поля со своими данными туда влюкчены и все методы? Значит всё-таки если класс имеет указатели на память сложных или простых объектов, то в области памяти объекта этого класса хранится указатель, а данные существую отдельно и именно для них нужен деструктор?
PM MAIL ICQ Skype   Вверх
bsa
Дата 17.10.2013, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Эти "костыли" просто так называемый "синтаксический сахар". Введено для унификации. По факту, конструкторы и деструкторы базовых типов вообще ничего не делают (для них даже код не генерится).
Я в них не вижу никакого усложнения кода.
Цитата(EgoBrain @  17.10.2013,  04:09 Найти цитируемый пост)
Так вот что включено в память выделенную под объект, разве не все поля со своими данными туда влюкчены и все методы?
Нестатические методы по факту это просто функции, первый параметр которых - указатель на объект. Но так как объект указывается при вызове такого метода, то этот параметр опускается. Все функции храняться в области кода программы. И при освобождении памяти объекта они никуда не деваются.

Цитата(EgoBrain @  17.10.2013,  04:09 Найти цитируемый пост)
Значит всё-таки если класс имеет указатели на память сложных или простых объектов, то в области памяти объекта этого класса хранится указатель, а данные существую отдельно и именно для них нужен деструктор? 
Да. Именно так. В общем случае, объект может выделять ресурсы (не только память, еще, например, файлы, мьютексы, потоки и пр.), а обязанность деструктора их освободить и вернуть системе.

PM   Вверх
EgoBrain
Дата 18.10.2013, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



bsa, спасибо, особенно за разъяснение насчет методов классов.
Да уж, ребята, когда заходишь за "фосад ООП", октрывается нелицеприятное зрелище. Какбуд-то бы убрали облицовку и вскрылось внутреннее содержание, иллюзии растворились.
Неужели в чисто ООП языках (java, C#) всё также?

Это сообщение отредактировал(а) EgoBrain - 18.10.2013, 01:44
PM MAIL ICQ Skype   Вверх
Amp
Дата 18.10.2013, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(EgoBrain @  18.10.2013,  01:44 Найти цитируемый пост)
Неужели в чисто ООП языках (java, C#) всё также?

В этих языках классы существуют на уровне виртуальной машины. За фасад особо не заглянешь, но порой можно стукнуться об него лбом или немного потереться об него - ограничение в 64KB кода на метод, OutOfMemoryError в PermGen, ClassLoader-ы и т.п.
PM MAIL   Вверх
bsa
Дата 18.10.2013, 13:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(EgoBrain @  18.10.2013,  02:44 Найти цитируемый пост)
Да уж, ребята, когда заходишь за "фосад ООП", октрывается нелицеприятное зрелище. Какбуд-то бы убрали облицовку и вскрылось внутреннее содержание, иллюзии растворились.
Чему ты удивляешься? Если заглянуть за фасад языка высокого уровня, то обнаружишь ассемблер. Который на 99% состоит из операций пересылки данных, перехода, арифметических и логических. Так что, какие умные схемы ни строй, в итоге все равно получается машинный код, а в нем ни ООП, ни классов, ни структур...
Это так же как дом. Внешне красивый, а начинаешь разбираться из чего он, оказывается: щебень, песок, цемент, сталь, глина (кирпич)...
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1238 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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