![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
zzkoderzzzx |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.10.2013 Репутация: нет Всего: нет |
Мне кажется, что эти методы имеют ряд преимуществ и недостатков относительно друг друга.
Например для удаления массива надо написать delete [], а delete удалит только первый его элемент. Это часто приводит к ошибкам. В то же время, free одинаково удалит как массив так и просто указатель. В то же время, new намного удобнее malloc, т.к. нет необходимости определять размер в байтах и приводить к нужному типу. Поэтому мне кажется удобным выделять память с помощью new, а освобождать с помощью free. Какие могут быть проблемы при таком подходе? |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
память выделенная посредством new может быть освобождена только посредством вызова delete. Так что Ваша идея провалилась, так делать нельзя.
|
|||
|
||||
zzkoderzzzx |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.10.2013 Репутация: нет Всего: нет |
А я делал и программа работала.
Это сообщение отредактировал(а) zzkoderzzzx - 16.10.2013, 11:15 |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
malloc/free всего лишь аллокаторы памяти. Т.е. они выделяют память и освобождают оную, безотносительно типов.
new/delete это конструкции языка C++, которые помимо выделения\освобождения памяти еще вызывают конструкторы и деструкторы объектов. Чаще всего выделение памяти в new сделано через malloc, а освобождение в delete через free. Но, во-первых, тут нет никакой гарантии, во-вторых: кто вызовет деструктор, если освободить память выделенную new посредством free? Раз уж Вы программируете на C++ запомните правило: если программа работает, это не значит, что она работает корректно. И еще одно: если программа работает корректно, это не значит, что нет утечек памяти. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
free использовать нельзя после new, так как он не вызывает деструкторы по определению. Это ведет к утечкам. Более того, если память была выделена с помощью new[], то результат вообще непредсказуем, так как free ничего не знает о возможном резерве в начале блока. К тому же, возможна ситуация, что оператор new был переопределен для какого-то типа и использует особый метод размещения в памяти, таким образом, используя неверный оператор освобождения памяти ты спровоцируешь неопределенное поведение программы. Поэтому, если ты выделил с помощью new, то освобождать должен только с помощью delete. Тоже самое касается и new[]/delete[], и malloc/calloc/free, и прочих аллокаторов. |
|||
|
||||
zzkoderzzzx |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.10.2013 Репутация: нет Всего: нет |
А зачем ввели 2 разных оператора delete и delete[]?
Т.е. почему delete не удаляет все объекты, выделенные с помощью new[]? Очевидно, что удаление только первого элемента массива нужно очень редко, и может быть реализовано отдельно без специального оператора. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
delete удаляет объект, delete[] удаляет массив объектов. Это разные случаи и требует разного подхода ни один не является частным случаем другого.
|
|||
|
||||
zzkoderzzzx |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.10.2013 Репутация: нет Всего: нет |
Когда массив объектов удаляется с помощью delete не выдается даже предупреждение, хотя скорее всего это ошибка программиста.
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
а какое может быть предупреждение? Откуда компилятору знать, что там лежит по указателю?
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
и вообще, хотя на практике new/delete обычно реализуются при помощи malloc/free (или обе пары при помощи одного механизма), никакой гарантии что они выделяют память совместимо нет (и даже что они могут работать с одним диапазоном адресов) |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
|
|||
|
||||
o2n3e |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 19.8.2011 Репутация: -4 Всего: -5 |
Модератор: Сообщение скрыто. |
|||
|
||||
zzkoderzzzx |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.10.2013 Репутация: нет Всего: нет |
А как делается new/delete базовых типов, у которых нет конструктора и деструктора? |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
конструктор и деструктор есть всегда. возможно, сгенерированный компилятором. возможно, пустой. Добавлено через 7 минут и 1 секунду вот например |
|||
|
||||
zzkoderzzzx |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.10.2013 Репутация: нет Всего: нет |
Такой код у меня дает ошибку
Как вызвать конструктор класса int? |
||||||
|
|||||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
второе - объявление функции без параметров возвращающей int. тут скобки не нужны, вызовется конструктор без параметров.
а первое - компилятор обнови http://ideone.com/hturq2 |
|||
|
||||
zzkoderzzzx |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 1.10.2013 Репутация: нет Всего: нет |
c++11 это уже не с++, а очередной С-подобный язык.
не понятно как в обычном с++ реализован вызов конструкторов/деструкторов в new/delete, раз для базовых типов это ошибка. Это сообщение отредактировал(а) zzkoderzzzx - 16.10.2013, 15:35 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
никакой ошибки нет.
будет выполнятся везде. так что это чисто синтаксические особенности, которые к наличию конструктора не относятся (понятно, что на самом деле у встроенных типов конструкторов нет, в смысле - они пустые. но семантически они есть всегда) с++ это то, что описано в стандарте Добавлено через 2 минуты и 12 секунд кстати насчет "истинного С++" http://codepad.org/3OO9pCHz |
|||
|
||||
o2n3e |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 19.8.2011 Репутация: -4 Всего: -5 |
Модератор: Сообщение скрыто. |
|||
|
||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Я знал, что это начнётся, и в теме по С++ начнутся вопросы и жалобы по другим языкам программирования. А вот! -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
реальные поцаны юзают фартран
|
|||
|
||||
EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
Блин, агитации o2n3e начинают на меня потихоньку действовать, он вскрывает недостатки о которых сам не задумываешься. Я до этого все узнаваемые нюансы и сложности с++ воспринимал как должное, как естественную природу вещей, но теперь начал задумываться "а как бы было если бы этого не было", согласен с
По теме. Писали что free освобождает память выделенную под объект, а new помимо этого вызывает деструктор. Так вот что включено в память выделенную под объект, разве не все поля со своими данными туда влюкчены и все методы? Значит всё-таки если класс имеет указатели на память сложных или простых объектов, то в области памяти объекта этого класса хранится указатель, а данные существую отдельно и именно для них нужен деструктор? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Эти "костыли" просто так называемый "синтаксический сахар". Введено для унификации. По факту, конструкторы и деструкторы базовых типов вообще ничего не делают (для них даже код не генерится).
Я в них не вижу никакого усложнения кода.
Да. Именно так. В общем случае, объект может выделять ресурсы (не только память, еще, например, файлы, мьютексы, потоки и пр.), а обязанность деструктора их освободить и вернуть системе. |
|||
|
||||
EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
bsa, спасибо, особенно за разъяснение насчет методов классов.
Да уж, ребята, когда заходишь за "фосад ООП", октрывается нелицеприятное зрелище. Какбуд-то бы убрали облицовку и вскрылось внутреннее содержание, иллюзии растворились. Неужели в чисто ООП языках (java, C#) всё также? Это сообщение отредактировал(а) EgoBrain - 18.10.2013, 01:44 |
|||
|
||||
Amp |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: 3 Всего: 17 |
В этих языках классы существуют на уровне виртуальной машины. За фасад особо не заглянешь, но порой можно стукнуться об него лбом или немного потереться об него - ограничение в 64KB кода на метод, OutOfMemoryError в PermGen, ClassLoader-ы и т.п. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Чему ты удивляешься? Если заглянуть за фасад языка высокого уровня, то обнаружишь ассемблер. Который на 99% состоит из операций пересылки данных, перехода, арифметических и логических. Так что, какие умные схемы ни строй, в итоге все равно получается машинный код, а в нем ни ООП, ни классов, ни структур... Это так же как дом. Внешне красивый, а начинаешь разбираться из чего он, оказывается: щебень, песок, цемент, сталь, глина (кирпич)... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |