Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/34: Рейтинг темы: голосов - 34, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65

В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?

25.08.2016, 14:27. Показов 7619. Ответов 32

Студворк — интернет-сервис помощи студентам
Язык программирования C поддерживает функции динамического управления пямятью: calloc, malloc, free, realloc - которые неподдерживают некоторые компиляторы C++. Вместо этих функций у них есть объектные операторы new и delete. В связи с этим у меня несколько вопросов. 1. Я написал образец программы, использующей статические и динамические переменные и массивы, но вывод первого массива iarray0 почему-то не работает. 2. Я не совсем понял разницу между статическими и динамическим переменными и массивами. 3. В чем преимущества операторов new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
    int main(int argc, char **argv)
    {
        // Использование статических переменных.
        int a0;
        int b0  = 5;
        a0 = 10;
        b0 = a0 + b0;
        // Использование статических массивов.
        int num0;
        std::cout << "Введите размер массива iarray0: ";
        int iarray0[num0];
        for(int i = 0;i < num0; i++)
        {
            iarray0[i] = i;
        }
        for(int i = 0;i < num0; i++)
        {
            std::cout << "Значение элемента " << i << " массива iarray0 = " << *(iarray0 + i) << std::endl;
        }
        // Использование динамических переменных.
        int *a1 = new int;
        int *b1 = new int(5);
        *a1 = 10;
        *b1 = *a1 + *b1;
        delete a1;
        delete b1;
        // Использование динамических массивов.
        int num1;
        std::cin >> num1;
        std::cout << "Введите размер массива iarray1: ";
        std::cin >> num1;
        int *iarray1 = new int[num1];
        for(int i = 0;i < num1; i++)
        {
            iarray1[i] = i;
        }
        for(int i = 0;i < num1; i++)
        {
            std::cout << "Значение элемента " << i << " массива iarray1 = " << iarray1[i] << std::endl;
        }
        delete[] iarray1;
        return 0;
    }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.08.2016, 14:27
Ответы с готовыми решениями:

Использование calloc/realloc/free
//calloc.cpp //Использование calloc #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; #include &lt;locale&gt; using...

Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc?
Интересует данный вопрос. Можно ли и имеет ли вобще смысл например выделять память под объект класса с помощью функций calloc, malloc или...

Работа с памятью через malloc,realloc и free
Вот начал работать с памятью в c++ и появилось несколько вопросов. 1 - r = (int *)malloc((1)*sizeof(int)); как я понимаю, эта запись...

32
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
28.08.2016, 14:58
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Стек предназначен для хранения адреса того места, откуда вызвалась подпрограмма
Стек предназначен для всего чего угодно и в том числе для автоматических переменных ( ну если кончно не хватает свободных регистров ).

Добавлено через 5 минут
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Под "обычные" переменные выделяется память в обычной памяти, точно также как и для динамических переменных.
Какой еще такой "обычной памяти"? Под обычные ( автоматические ) переменные или вообще память не выделяется ( в простых случаях, когда хватает регистров ), или выделяется на стеке ( а в идеале даже регистры могут не понадобиться, потому что компилятор вообще все вычисления смог соптимизировать еще в во время компиляции )


Не по теме:

Правда память на стеке конечно тоже вполне себе обычная, так что даже и не поспоришь :)

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
28.08.2016, 15:16
Цитата Сообщение от Babysitter Посмотреть сообщение
gcc и clang компилят, им то что, си чистый то может. через alloca реализация наверное.
без флага педантик даже варнинги не показывают, наглецы.
Дык в странице же нельзя создать массив неизвестного размера. Если не залопатить заранее страницу максимально неизвестного размера. Причём на каждый массив. С другой стороны создание массивов на стеке само по себе штука острая, но... Они не настоящие массивы там делают!
Как говорила одна моя знакомая:-"Счастье - штука недостижимая... Но с другой стороны, - его так просто имитировать!".
Никому нельзя верить.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
28.08.2016, 15:28
Цитата Сообщение от IGPIGP Посмотреть сообщение
Дык в странице же нельзя создать массив неизвестного размера. Если не залопатить заранее страницу максимально неизвестного размера. Причём на каждый массив. С другой стороны создание массивов на стеке само по себе штука острая, но... Они не настоящие массивы там делают!
Как говорила одна моя знакомая:-"Счастье - штука недостижимая... Но с другой стороны, - его так просто имитировать!".
Никому нельзя верить.
В какой странице? О чем тут вообще речь?

Произвольное кол-во памяти на стеке выделяется элементарно, для этого уменьшается регистр esp на нужно число байт. Надо на стеке 10 кб? Элементарно, все что нужно сделать - sub ESP, 10240 ( ну и конечно не забыть потом восстановить ESP ). Всякие page guard'ы для стековых страниц отработают автоматически.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
28.08.2016, 15:54
Цитата Сообщение от Voivoid Посмотреть сообщение
Произвольное кол-во памяти на стеке выделяется элементарно
Я смутно представляю эту технологию. Где почитать не подскажете?
Однако с тем что представляю, я вижу что технология вызова в С отличается от таковой в С++. Получается, что функция имея массив выделяет память поэтапно? Ведь для вычисления необходимого и заранее неизвестного объёма нужно уже предоставить какую-то рабочую область... Тогда стек С++ должен быть быстрее, ведь выделение памяти поэтапно да ещё с вычислениями, это уже путь к динамическому использованию памяти...
Я мало знаю. Надо читать.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
28.08.2016, 16:20
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я смутно представляю эту технологию. Где почитать не подскажете?
Ассемблер наверное неплохо бы хотя бы в общих чертах изучить. Я бы посоветовал http://www.apress.com/9781484200650 . pdf при желании гуглится.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Ведь для вычисления необходимого и заранее неизвестного объёма нужно уже предоставить какую-то рабочую область...
Да, память под стек выделяется постранично в некоторой заранее для этого предназначенной ОС области памяти, но механизм этого выделения для пользователя в целом невидим. Просто знай себе и пиши в стек. Подробности можно здесь например посмотреть - https://geidav.wordpress.com/2... locations/

Добавлено через 5 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Однако с тем что представляю, я вижу что технология вызова в С отличается от таковой в С++
Не очень понял о чем речь.
1
28.08.2016, 16:21

Не по теме:

IGPIGP, по секрету - на простых микроконтроллерах (например AVR Tiny|Mega) все просто и сердито - полный Гарвард, осы почти не летают, страницы не переворачиваются, линейная память, стек внизу - растет вверх, куча вверху - растет вниз. Для начала знакомства самое то.

0
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
29.08.2016, 07:10  [ТС]
В Java переменные элементарных типов: short, int, long - обрабатываются намного быстрее, чем их объектные аналоги: Short, Integer, Long - созданые оператором new, а в C++ в моём примере статические и динамические переменные обрабатываются с одинаковой скоростью или нет?
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
29.08.2016, 09:11
kokzahvas, это совсем не тот new, который в джаве. этот new ближе к сишному malloc.
это просто такое явное выделение памяти, в каком-то абстрактном free storage, который в наших реализациях является кучей.

короче говоря, если есть некий автоматический объект (ну или не совсем объект - элементарный тип) - на стеке
и точно такой же объект, но уже динамический - на куче, адрес полученный через new,

то сами эти объекты будут абсолютно идентичными байт в байт. работа с ними по скорости никак не отличается.
но чисто технически сам момент выделения и освобождения памяти для стековых переменных быстрее
0
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
29.08.2016, 13:52  [ТС]
Цитата Сообщение от Babysitter Посмотреть сообщение
kokzahvas, это совсем не тот new, который в джаве. этот new ближе к сишному malloc.
Если malloc в СИ это new в C++, а free в СИ это delete в C++, то как с помощью new-expression C++ заменить realloc и calloc?
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
29.08.2016, 14:00
Цитата Сообщение от kokzahvas Посмотреть сообщение
и calloc?
А на кой, спрашивается оно нужно?
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
29.08.2016, 14:13
Цитата Сообщение от kokzahvas Посмотреть сообщение
заменить realloc
страуструповское чаво
0
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
30.08.2016, 07:35  [ТС]
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
А на кой, спрашивается оно нужно?
Я не знаю, но если функция calloc существует, значит она нужна.

Добавлено через 3 минуты
Цитата Сообщение от Babysitter Посмотреть сообщение
Я знаю, давно надо было английский язык выучить, но видать не судьба. А вы могли бы своими словами.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
30.08.2016, 08:53
Лучший ответ Сообщение было отмечено kokzahvas как решение

Решение

Цитата Сообщение от kokzahvas Посмотреть сообщение
Если malloc в СИ это new в C++, а free в СИ это delete в C++
malloc в Cи - это operator new/operator new[] в С++.
free - соответственно, operator delete/operator delete[]

А вот new-expression и delete-expression делают больше - отвечают помимо памяти за конструкторы и деструкторы. Так что аналогов в Си этому нет. По этой же причине нет renew или чего-то подобного. Потому что недостаточно просто перевыделить или расширить память, нужно еще что-то сделать с копированием объектов (читай - вызовом конструкторов).

А Страуструп в своем FAQ пишет о двух вещах:
* realloc работает только с malloc, и не подходит, если у объекта есть нетривиальные конструкторы копирования (см. предыдущий абзац)
* В общем случае realloc все равно занимается копированием памяти.
И в качестве альтернативы расширяемого массива объектов - предлагается вектор.

При этом, вектор предлагается как генерализованное решение, для распространенных случаев. И то - он не всем нравится. Представляешь, если бы что-то такое было в ядре языка? Короче, Страуструп выбрал путь гибкости, и предоставил программисту возможность это контролировать. Т.к. в случае объектов, все заметно усложняется в зависимости от их содержимого.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2016, 08:53

Что быстрее/эффективнее malloc/realloc или new/delete?
Всем привет. Год программировал на СИ под микроконтроллеры... Начал изучать с++... Всё ново, интересно... Доковырялся до STL... В процессе...

Нужно, чтобы память под массив выделялась не через: new — delete, а через оператор malloc (calloc) — free
Ребят, есть программа, которая работает, но нужно, чтобы память под массив выделялась не через : new - delete, а через оператор...

Почему так себя ведёт программа? Функции: malloc(), realloc(), free()
Почему большинство значений в output 0 и несколько из значений не равно 0? /* * malloc_play.c: bizzarro programma per studiare...

Отличия между функциями malloc, calloc и realloc и способами их использования
На этом форуме есть множество тем по функциям malloc, calloc и realloc, но я так и не понял чем они друг от друг отличаются и в каких...

Из malloc-free в new delete
Есть код с выделением памяти с помощью malloc, надо сделать с new delete Вроде сделал, освобождение памяти работает, а с выделением...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru