Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
kokzahvas
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
25.08.2016, 14:27     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #1
Язык программирования 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;
    }
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2016, 14:27     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
Посмотрите здесь:

В чем разница malloc и calloc? C++
calloc vs malloc C++
C++ Работа с памятью через malloc,realloc и free
C++ Использование calloc/realloc/free
функции на основе realloc, malloc C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
25.08.2016, 14:37     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #2
C++
1
2
        int num0;
        int iarray0[num0];
Хм, как такое вообще скомпилилось? Да даже если и скомпилилось, какой размер у массива?

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

Добавлено через 3 минуты
Цитата Сообщение от kokzahvas Посмотреть сообщение
Вместо этих функций у них есть объектные операторы new и delete.
Откуда взялось это слово "объектные"?
HelicopterK52
633 / 176 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
25.08.2016, 14:41     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #3
Цитата Сообщение от kokzahvas Посмотреть сообщение
calloc, malloc, free, realloc - которые неподдерживают некоторые компиляторы C++
Какие это?
Цитата Сообщение от kokzahvas Посмотреть сообщение
Вместо этих функций у них есть объектные операторы new и delete.
Это есть не у компиляторов, это есть в языке. Причем то, что Вы описываете - это new-expression, а не operator new.
Цитата Сообщение от kokzahvas Посмотреть сообщение
В чем преимущества операторов new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
Конструкторы, деструкторы? Не, не слышал... Возьмите книжку для начинающих, почитайте.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
26.08.2016, 15:42     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #4
Массивы: Если размер массива неизвестен
Malloc + reinterept_cast и new. В чем разница?
kokzahvas
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
27.08.2016, 07:25  [ТС]     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #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 ошибки.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
27.08.2016, 15:33     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #6
Цитата Сообщение от kokzahvas Посмотреть сообщение
А можно поподробнее про разницу в области памяти.
Память под "обычные" переменные выделяется в стеке и освобождается, когда переменная выходит из области видимости. Под динамические созданные переменные память выделяется в т.н. "куче" - специальной области памяти (реализация зависит от среды, где выполняется программа). Освобождается память явно, когда программист вызывает delete.
DemolitionMan
 Аватар для DemolitionMan
22 / 54 / 18
Регистрация: 06.04.2016
Сообщений: 325
27.08.2016, 16:05     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #7
Почему в стеке выделяется память под "обычные" переменные? Стек предназначен для хранения адреса того места, откуда вызвалась подпрограмма. Изучайте ассемблер, товарищ. Под "обычные" переменные выделяется память в обычной памяти, точно также как и для динамических переменных.
По теме могу сказать, что статические переменные или функции, объявленные со словом static, создаются без создания экземпляра класса. Эта тема относится к классам и объектам.
_Ivana
2177 / 1382 / 124
Регистрация: 01.03.2013
Сообщений: 4,120
Записей в блоге: 2
27.08.2016, 16:48     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #8
DemolitionMan, вот это наш человек! Так их, этих неумех! Присоединяйтесь, здесь уже подобралась группа знающих гуру.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
27.08.2016, 17:10     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #9
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Почему в стеке выделяется память под "обычные" переменные?
Да все они обычные. То есть, необычные они все. На стеке создаются стековые автоматические переменные. В данном обсуждении их назвали "обычными". Обычно в этом нет ничего необычного.
Цитата Сообщение от _Ivana Посмотреть сообщение
DemolitionMan, вот это наш человек!
Да! Плюсы в широкие массы! _Ivana, я тоже ещё тот плюсовик. Но неумех не вижу.
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
27.08.2016, 17:49     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #10
чертовы фортранщики и сюда добрались.
когда VLA в плюсы просочился?

Добавлено через 6 минут
слава страуструпу, хоть с флагом pedantic кидает варнинг.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
27.08.2016, 18:15     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #11
Цитата Сообщение от Babysitter Посмотреть сообщение
когда VLA в плюсы просочился?
Мужикам, - по бабе, бабам, - по мужику. Массивам в плюсах - по const expr размеру! Это же справедливо?
Цитата Сообщение от Babysitter Посмотреть сообщение
слава страуструпу
Во истину.
_Ivana
2177 / 1382 / 124
Регистрация: 01.03.2013
Сообщений: 4,120
Записей в блоге: 2
27.08.2016, 21:51     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #12
Цитата Сообщение от IGPIGP Посмотреть сообщение
_Ivana, я тоже ещё тот плюсовик. Но неумех не вижу.
Вот если вы начнете писать откровенные глупости менторским тоном (хотя мне тяжело вас представить в такой роли ), тогда я тоже напишу вам, что вы очередной наш человек (С) и предложу присоединиться к группе подобных гуру этого форума
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
27.08.2016, 22:08     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #13
Цитата Сообщение от _Ivana Посмотреть сообщение
Вот если вы начнете писать откровенные глупости менторским тоном (хотя мне тяжело вас представить в такой роли)
Не смогу. Нельзя начать что-либо дважды.
Я понял, _Ivana, это был сарказм. О менторском тоне. Я свободно могу написать что-то вроде:
Цитата Сообщение от Из упанишад
Массивы, это боевые слоны статической типизации. Эти священные животные, традиционно покрыты бронёй, цветами и матом растаптываемых врагов.
Не помню, мог ли я это где-нибудь вычитать. Всё это от того, наверное, что глядя на автоматический массив, никогда и не скажешь, что он автоматический.
DemolitionMan
 Аватар для DemolitionMan
22 / 54 / 18
Регистрация: 06.04.2016
Сообщений: 325
28.08.2016, 12:48     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #14
Почему в стеке выделяется память под "обычные" переменные? Под
Цитата Сообщение от IGPIGP Посмотреть сообщение
Да все они обычные. То есть, необычные они все. На стеке создаются стековые автоматические переменные. В данном обсуждении их назвали "обычными". Обычно в этом нет ничего необычного.
- они все автоматические.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
28.08.2016, 13:05     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #15
Цитата Сообщение от DemolitionMan Посмотреть сообщение
- они все автоматические.
Кто же спорит. Книг полно, но если человеку не пошло и он "на пальцах" спрашивает? Ему так и объясняют. А автоматическими ещё называют переменными "на стеке", имея ввиду стековый автомат захвата-освобождения. То есть всё происходит без явного участия программиста. Поэтому, если нет уточнения в виде "статический/динамический", то говорят о автоматической. Регистровые упоминают нечасто и не на ночь. Статические имеют два контекста, класс хранения и область видимости в программе (многофайловой). То есть, если говорить строго и подробно, то ничего объяснить не удастся.
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
28.08.2016, 14:01     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #16
ну классно, можно сказать, что все переменные хранятся в ram и не заморачиваться, да?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
28.08.2016, 14:04     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #17
Цитата Сообщение от Babysitter Посмотреть сообщение
ну классно, можно сказать, что все переменные хранятся в ram и не заморачиваться, да?
Утрируете.
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
28.08.2016, 14:23     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #18
Цитата Сообщение от IGPIGP Посмотреть сообщение
Утрируете.
я не утрирую, я за ним повторяю. ram = обычная память? обычней некуда. мы же можем взять указатель от автоматической переменной? можем взять от динамически выделенной? можем, это просто адреса, плоская модель. память одна и та же. это он пытается сказать? зачем нам эти стеки/кучи/бсс/область данных - все это рам.

Добавлено через 3 минуты
а вообще первое, что в этом топике должно было быть сказано - стандарт c++ не поддерживает vla.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
28.08.2016, 14:29     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #19
Цитата Сообщение от Babysitter Посмотреть сообщение
зачем нам эти стеки/кучи/
Компилятор ты могуч,
Кучи стеков, стеки куч...

У TC противопоставляются статические и динамические переменные, в то время как вместо статических он хотел сказать о автоматических. С этого и пошло. Есть 2 пути. Объяснять на коленке или щелкнуть в нос и послать учиться.
Мне интересно, почему скомпилировалось у него. Есть компиляторы которым море по колено?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2016, 14:32     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
Еще ссылки по теме:

Чем заменить calloc? C++
C++ Malloc / calloc
Что быстрее/эффективнее malloc/realloc или new/delete? C++

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

Или воспользуйтесь поиском по форуму:
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
28.08.2016, 14:32     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #20
Цитата Сообщение от IGPIGP Посмотреть сообщение
Мне интересно, почему скомпилировалось у него. Есть компиляторы которым море по колено?
gcc и clang компилят, им то что, си чистый то может. через alloca реализация наверное.
без флага педантик даже варнинги не показывают, наглецы.
Yandex
Объявления
28.08.2016, 14:32     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
Ответ Создать тему

Метки
динамический массив, статический массив
Опции темы

Текущее время: 06:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru