| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Совместное использование new/delete и malloc/free |
| Автор: zzkoderzzzx 16.10.2013, 10:59 |
| Мне кажется, что эти методы имеют ряд преимуществ и недостатков относительно друг друга. Например для удаления массива надо написать delete [], а delete удалит только первый его элемент. Это часто приводит к ошибкам. В то же время, free одинаково удалит как массив так и просто указатель. В то же время, new намного удобнее malloc, т.к. нет необходимости определять размер в байтах и приводить к нужному типу. Поэтому мне кажется удобным выделять память с помощью new, а освобождать с помощью free. Какие могут быть проблемы при таком подходе? |
| Автор: vinter 16.10.2013, 11:09 |
| память выделенная посредством new может быть освобождена только посредством вызова delete. Так что Ваша идея провалилась, так делать нельзя. |
| Автор: zzkoderzzzx 16.10.2013, 11:14 |
| А я делал и программа работала. |
| Автор: vinter 16.10.2013, 11:20 |
| malloc/free всего лишь аллокаторы памяти. Т.е. они выделяют память и освобождают оную, безотносительно типов. new/delete это конструкции языка C++, которые помимо выделения\освобождения памяти еще вызывают конструкторы и деструкторы объектов. Чаще всего выделение памяти в new сделано через malloc, а освобождение в delete через free. Но, во-первых, тут нет никакой гарантии, во-вторых: кто вызовет деструктор, если освободить память выделенную new посредством free? Раз уж Вы программируете на C++ запомните правило: если программа работает, это не значит, что она работает корректно. И еще одно: если программа работает корректно, это не значит, что нет утечек памяти. |
| Автор: zzkoderzzzx 16.10.2013, 11:41 |
| А зачем ввели 2 разных оператора delete и delete[]? Т.е. почему delete не удаляет все объекты, выделенные с помощью new[]? Очевидно, что удаление только первого элемента массива нужно очень редко, и может быть реализовано отдельно без специального оператора. |
| Автор: vinter 16.10.2013, 11:45 |
| delete удаляет объект, delete[] удаляет массив объектов. Это разные случаи и требует разного подхода ни один не является частным случаем другого. |
| Автор: zzkoderzzzx 16.10.2013, 12:58 |
| Когда массив объектов удаляется с помощью delete не выдается даже предупреждение, хотя скорее всего это ошибка программиста. |
| Автор: vinter 16.10.2013, 13:06 |
| а какое может быть предупреждение? Откуда компилятору знать, что там лежит по указателю? |
| Автор: baldina 16.10.2013, 13:12 | ||
и вообще, хотя на практике new/delete обычно реализуются при помощи malloc/free (или обе пары при помощи одного механизма), никакой гарантии что они выделяют память совместимо нет (и даже что они могут работать с одним диапазоном адресов) |
| Автор: bsa 16.10.2013, 13:26 |
| Ты сильно ошибаешься. Например, выделение массивов в моих программах вообще нет - я пользуюсь std::vector и пр. контейнерами (у них механизм выделения памяти несколько отличается от банального new Object[N]). А вот создание динамических объектов вне массивов очень активно используется. |
| Автор: o2n3e 16.10.2013, 14:16 |
Модератор: Сообщение скрыто. |
| Автор: zzkoderzzzx 16.10.2013, 14:24 | ||
А как делается new/delete базовых типов, у которых нет конструктора и деструктора? |
| Автор: baldina 16.10.2013, 14:32 |
конструктор и деструктор есть всегда. возможно, сгенерированный компилятором. возможно, пустой. Добавлено через 7 минут и 1 секунду http://codepad.org/HqC8gNVK например |
| Автор: zzkoderzzzx 16.10.2013, 15:05 | ||||||
Такой код у меня дает ошибку
Как вызвать конструктор класса int? |
| Автор: baldina 16.10.2013, 15:18 |
| второе - объявление функции без параметров возвращающей int. тут скобки не нужны, вызовется конструктор без параметров. а первое - компилятор обнови http://ideone.com/hturq2 |
| Автор: zzkoderzzzx 16.10.2013, 15:33 |
| c++11 это уже не с++, а очередной С-подобный язык. не понятно как в обычном с++ реализован вызов конструкторов/деструкторов в new/delete, раз для базовых типов это ошибка. |
| Автор: baldina 16.10.2013, 15:55 | ||
никакой ошибки нет.
будет выполнятся везде. так что это чисто синтаксические особенности, которые к наличию конструктора не относятся (понятно, что на самом деле у встроенных типов конструкторов нет, в смысле - они пустые. но семантически они есть всегда) с++ это то, что описано в стандарте Добавлено через 2 минуты и 12 секунд кстати насчет "истинного С++" http://codepad.org/3OO9pCHz |
| Автор: o2n3e 16.10.2013, 17:17 |
Модератор: Сообщение скрыто. |
| Автор: akizelokro 16.10.2013, 18:04 | ||
Я знал, что это начнётся, и в теме по С++ начнутся вопросы и жалобы по другим языкам программирования. А вот! |
| Автор: baldina 16.10.2013, 18:41 |
| реальные поцаны юзают фартран |
| Автор: EgoBrain 17.10.2013, 03:09 | ||
Блин, агитации o2n3e начинают на меня потихоньку действовать, он вскрывает недостатки о которых сам не задумываешься. Я до этого все узнаваемые нюансы и сложности с++ воспринимал как должное, как естественную природу вещей, но теперь начал задумываться "а как бы было если бы этого не было", согласен с
По теме. Писали что free освобождает память выделенную под объект, а new помимо этого вызывает деструктор. Так вот что включено в память выделенную под объект, разве не все поля со своими данными туда влюкчены и все методы? Значит всё-таки если класс имеет указатели на память сложных или простых объектов, то в области памяти объекта этого класса хранится указатель, а данные существую отдельно и именно для них нужен деструктор? |
| Автор: bsa 17.10.2013, 10:32 | ||||
| Эти "костыли" просто так называемый "синтаксический сахар". Введено для унификации. По факту, конструкторы и деструкторы базовых типов вообще ничего не делают (для них даже код не генерится). Я в них не вижу никакого усложнения кода.
|
| Автор: EgoBrain 18.10.2013, 01:44 |
| bsa, спасибо, особенно за разъяснение насчет методов классов. Да уж, ребята, когда заходишь за "фосад ООП", октрывается нелицеприятное зрелище. Какбуд-то бы убрали облицовку и вскрылось внутреннее содержание, иллюзии растворились. Неужели в чисто ООП языках (java, C#) всё также? |
| Автор: Amp 18.10.2013, 12:49 |
В этих языках классы существуют на уровне виртуальной машины. За фасад особо не заглянешь, но порой можно стукнуться об него лбом или немного потереться об него - ограничение в 64KB кода на метод, OutOfMemoryError в PermGen, ClassLoader-ы и т.п. |
| Автор: bsa 18.10.2013, 13:24 | ||
Это так же как дом. Внешне красивый, а начинаешь разбираться из чего он, оказывается: щебень, песок, цемент, сталь, глина (кирпич)... |