![]() |
Модераторы: 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? |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |