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

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

25.08.2016, 14:27. Показов 7797. Ответов 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
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,834
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
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru