0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
1

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

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

Author24 — интернет-сервис помощи студентам
Язык программирования 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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;...

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

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

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

32
2268 / 1761 / 739
Регистрация: 27.07.2012
Сообщений: 5,233
25.08.2016, 14:37 2
C++
1
2
        int num0;
        int iarray0[num0];
Хм, как такое вообще скомпилилось? Да даже если и скомпилилось, какой размер у массива?

Добавлено через 3 минуты
Цитата Сообщение от kokzahvas Посмотреть сообщение
2. Я не совсем понял разницу между статическими и динамическим переменными и массивами.
Разница в области памяти, в которой эти переменные и массивы создаются. Это во-первых. А во-вторых, статические переменные объявляются с ключевым словом static. В примере таких нет.

Добавлено через 3 минуты
Цитата Сообщение от kokzahvas Посмотреть сообщение
Вместо этих функций у них есть объектные операторы new и delete.
Откуда взялось это слово "объектные"?
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
25.08.2016, 14:41 3
Цитата Сообщение от kokzahvas Посмотреть сообщение
calloc, malloc, free, realloc - которые неподдерживают некоторые компиляторы C++
Какие это?
Цитата Сообщение от kokzahvas Посмотреть сообщение
Вместо этих функций у них есть объектные операторы new и delete.
Это есть не у компиляторов, это есть в языке. Причем то, что Вы описываете - это new-expression, а не operator new.
Цитата Сообщение от kokzahvas Посмотреть сообщение
В чем преимущества операторов new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
Конструкторы, деструкторы? Не, не слышал... Возьмите книжку для начинающих, почитайте.
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
26.08.2016, 15:42 4
Массивы: Если размер массива неизвестен
Malloc + reinterept_cast и new. В чем разница?
0
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
27.08.2016, 07:25  [ТС] 5
Я исправил код. Строка «std::cin >> num0;» была не там, где ей надо быть.
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: ";
        std::cin >> num0;
        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::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;
    }
Добавлено через 10 минут
Цитата Сообщение от John Prick Посмотреть сообщение
Разница в области памяти, в которой эти переменные и массивы создаются. Это во-первых. А во-вторых, статические переменные объявляются с ключевым словом static. В примере таких нет. Откуда взялось это слово "объектные"?
А можно поподробнее про разницу в области памяти. Слово «статические» я использовал чтобы отделить переменные объявленные обычным способом от переменных созданных с помощью оператора new. Слово «объектные» я использовал по той же причине.

Добавлено через 7 минут
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Какие это?
AIDE например. Он на malloc ошибки.
0
2268 / 1761 / 739
Регистрация: 27.07.2012
Сообщений: 5,233
27.08.2016, 15:33 6
Цитата Сообщение от kokzahvas Посмотреть сообщение
А можно поподробнее про разницу в области памяти.
Память под "обычные" переменные выделяется в стеке и освобождается, когда переменная выходит из области видимости. Под динамические созданные переменные память выделяется в т.н. "куче" - специальной области памяти (реализация зависит от среды, где выполняется программа). Освобождается память явно, когда программист вызывает delete.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
27.08.2016, 16:05 7
Почему в стеке выделяется память под "обычные" переменные? Стек предназначен для хранения адреса того места, откуда вызвалась подпрограмма. Изучайте ассемблер, товарищ. Под "обычные" переменные выделяется память в обычной памяти, точно также как и для динамических переменных.
По теме могу сказать, что статические переменные или функции, объявленные со словом static, создаются без создания экземпляра класса. Эта тема относится к классам и объектам.
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
27.08.2016, 16:48 8
DemolitionMan, вот это наш человек! Так их, этих неумех! Присоединяйтесь, здесь уже подобралась группа знающих гуру.
3
Комп_Оратор)
Эксперт по математике/физике
8948 / 4702 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
27.08.2016, 17:10 9
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Почему в стеке выделяется память под "обычные" переменные?
Да все они обычные. То есть, необычные они все. На стеке создаются стековые автоматические переменные. В данном обсуждении их назвали "обычными". Обычно в этом нет ничего необычного.
Цитата Сообщение от _Ivana Посмотреть сообщение
DemolitionMan, вот это наш человек!
Да! Плюсы в широкие массы! _Ivana, я тоже ещё тот плюсовик. Но неумех не вижу.
0
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
27.08.2016, 17:49 10
чертовы фортранщики и сюда добрались.
когда VLA в плюсы просочился?

Добавлено через 6 минут
слава страуструпу, хоть с флагом pedantic кидает варнинг.
1
Комп_Оратор)
Эксперт по математике/физике
8948 / 4702 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
27.08.2016, 18:15 11
Цитата Сообщение от Babysitter Посмотреть сообщение
когда VLA в плюсы просочился?
Мужикам, - по бабе, бабам, - по мужику. Массивам в плюсах - по const expr размеру! Это же справедливо?
Цитата Сообщение от Babysitter Посмотреть сообщение
слава страуструпу
Во истину.
1
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
27.08.2016, 21:51 12
Цитата Сообщение от IGPIGP Посмотреть сообщение
_Ivana, я тоже ещё тот плюсовик. Но неумех не вижу.
Вот если вы начнете писать откровенные глупости менторским тоном (хотя мне тяжело вас представить в такой роли ), тогда я тоже напишу вам, что вы очередной наш человек (С) и предложу присоединиться к группе подобных гуру этого форума
1
Комп_Оратор)
Эксперт по математике/физике
8948 / 4702 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
27.08.2016, 22:08 13
Цитата Сообщение от _Ivana Посмотреть сообщение
Вот если вы начнете писать откровенные глупости менторским тоном (хотя мне тяжело вас представить в такой роли)
Не смогу. Нельзя начать что-либо дважды.
Я понял, _Ivana, это был сарказм. О менторском тоне. Я свободно могу написать что-то вроде:
Цитата Сообщение от Из упанишад
Массивы, это боевые слоны статической типизации. Эти священные животные, традиционно покрыты бронёй, цветами и матом растаптываемых врагов.
Не помню, мог ли я это где-нибудь вычитать. Всё это от того, наверное, что глядя на автоматический массив, никогда и не скажешь, что он автоматический.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
28.08.2016, 12:48 14
Почему в стеке выделяется память под "обычные" переменные? Под
Цитата Сообщение от IGPIGP Посмотреть сообщение
Да все они обычные. То есть, необычные они все. На стеке создаются стековые автоматические переменные. В данном обсуждении их назвали "обычными". Обычно в этом нет ничего необычного.
- они все автоматические.
0
Комп_Оратор)
Эксперт по математике/физике
8948 / 4702 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
28.08.2016, 13:05 15
Цитата Сообщение от DemolitionMan Посмотреть сообщение
- они все автоматические.
Кто же спорит. Книг полно, но если человеку не пошло и он "на пальцах" спрашивает? Ему так и объясняют. А автоматическими ещё называют переменными "на стеке", имея ввиду стековый автомат захвата-освобождения. То есть всё происходит без явного участия программиста. Поэтому, если нет уточнения в виде "статический/динамический", то говорят о автоматической. Регистровые упоминают нечасто и не на ночь. Статические имеют два контекста, класс хранения и область видимости в программе (многофайловой). То есть, если говорить строго и подробно, то ничего объяснить не удастся.
0
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
28.08.2016, 14:01 16
ну классно, можно сказать, что все переменные хранятся в ram и не заморачиваться, да?
0
Комп_Оратор)
Эксперт по математике/физике
8948 / 4702 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
28.08.2016, 14:04 17
Цитата Сообщение от Babysitter Посмотреть сообщение
ну классно, можно сказать, что все переменные хранятся в ram и не заморачиваться, да?
Утрируете.
0
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
28.08.2016, 14:23 18
Цитата Сообщение от IGPIGP Посмотреть сообщение
Утрируете.
я не утрирую, я за ним повторяю. ram = обычная память? обычней некуда. мы же можем взять указатель от автоматической переменной? можем взять от динамически выделенной? можем, это просто адреса, плоская модель. память одна и та же. это он пытается сказать? зачем нам эти стеки/кучи/бсс/область данных - все это рам.

Добавлено через 3 минуты
а вообще первое, что в этом топике должно было быть сказано - стандарт c++ не поддерживает vla.
0
Комп_Оратор)
Эксперт по математике/физике
8948 / 4702 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
28.08.2016, 14:29 19
Цитата Сообщение от Babysitter Посмотреть сообщение
зачем нам эти стеки/кучи/
Компилятор ты могуч,
Кучи стеков, стеки куч...

У TC противопоставляются статические и динамические переменные, в то время как вместо статических он хотел сказать о автоматических. С этого и пошло. Есть 2 пути. Объяснять на коленке или щелкнуть в нос и послать учиться.
Мне интересно, почему скомпилировалось у него. Есть компиляторы которым море по колено?
0
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
28.08.2016, 14:32 20
Цитата Сообщение от IGPIGP Посмотреть сообщение
Мне интересно, почему скомпилировалось у него. Есть компиляторы которым море по колено?
gcc и clang компилят, им то что, си чистый то может. через alloca реализация наверное.
без флага педантик даже варнинги не показывают, наглецы.
1
28.08.2016, 14:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2016, 14:32
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru