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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
kokzahvas
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
#1

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

25.08.2016, 14:27. Просмотров 928. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2016, 14:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? (C++):

Использование calloc/realloc/free - C++
//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? - C++
Интересует данный вопрос. Можно ли и имеет ли вобще смысл например выделять память под объект класса с помощью функций calloc, malloc или...

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

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

В чем разница malloc и calloc? - C++
подскажите пожалуйста,в чем разница malloc и calloc? эмалок выделение динамической памяти а сиалок выделение чистой памяти. в смысле...

функции на основе realloc, malloc - C++
Подскажите как сократить написание &quot;realloc&quot;, а то надоели эти писанины))) вот сделал уже следующее: size_t GetSize(void* Array) ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
25.08.2016, 14:37 #2
C++
1
2
        int num0;
        int iarray0[num0];
Хм, как такое вообще скомпилилось? Да даже если и скомпилилось, какой размер у массива?

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

Добавлено через 3 минуты
Цитата Сообщение от kokzahvas Посмотреть сообщение
Вместо этих функций у них есть объектные операторы new и delete.
Откуда взялось это слово "объектные"?
0
HelicopterK52
660 / 203 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 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
Croessmah
Эксперт CЭксперт С++
13205 / 7476 / 839
Регистрация: 27.09.2012
Сообщений: 18,379
Записей в блоге: 3
Завершенные тесты: 1
26.08.2016, 15:42 #4
Массивы: Если размер массива неизвестен
Malloc + reinterept_cast и new. В чем разница?
0
kokzahvas
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
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
27.08.2016, 15:33 #6
Цитата Сообщение от kokzahvas Посмотреть сообщение
А можно поподробнее про разницу в области памяти.
Память под "обычные" переменные выделяется в стеке и освобождается, когда переменная выходит из области видимости. Под динамические созданные переменные память выделяется в т.н. "куче" - специальной области памяти (реализация зависит от среды, где выполняется программа). Освобождается память явно, когда программист вызывает delete.
0
DemolitionMan
97 / 153 / 47
Регистрация: 06.04.2016
Сообщений: 992
27.08.2016, 16:05 #7
Почему в стеке выделяется память под "обычные" переменные? Стек предназначен для хранения адреса того места, откуда вызвалась подпрограмма. Изучайте ассемблер, товарищ. Под "обычные" переменные выделяется память в обычной памяти, точно также как и для динамических переменных.
По теме могу сказать, что статические переменные или функции, объявленные со словом static, создаются без создания экземпляра класса. Эта тема относится к классам и объектам.
0
_Ivana
3147 / 1774 / 152
Регистрация: 01.03.2013
Сообщений: 4,977
Записей в блоге: 2
27.08.2016, 16:48 #8
DemolitionMan, вот это наш человек! Так их, этих неумех! Присоединяйтесь, здесь уже подобралась группа знающих гуру.
3
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6466 / 3114 / 306
Регистрация: 04.12.2011
Сообщений: 8,588
Записей в блоге: 4
27.08.2016, 17:10 #9
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Почему в стеке выделяется память под "обычные" переменные?
Да все они обычные. То есть, необычные они все. На стеке создаются стековые автоматические переменные. В данном обсуждении их назвали "обычными". Обычно в этом нет ничего необычного.
Цитата Сообщение от _Ivana Посмотреть сообщение
DemolitionMan, вот это наш человек!
Да! Плюсы в широкие массы! _Ivana, я тоже ещё тот плюсовик. Но неумех не вижу.
0
Babysitter
80 / 107 / 35
Регистрация: 23.11.2015
Сообщений: 332
Завершенные тесты: 1
27.08.2016, 17:49 #10
чертовы фортранщики и сюда добрались.
когда VLA в плюсы просочился?

Добавлено через 6 минут
слава страуструпу, хоть с флагом pedantic кидает варнинг.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6466 / 3114 / 306
Регистрация: 04.12.2011
Сообщений: 8,588
Записей в блоге: 4
27.08.2016, 18:15 #11
Цитата Сообщение от Babysitter Посмотреть сообщение
когда VLA в плюсы просочился?
Мужикам, - по бабе, бабам, - по мужику. Массивам в плюсах - по const expr размеру! Это же справедливо?
Цитата Сообщение от Babysitter Посмотреть сообщение
слава страуструпу
Во истину.
1
_Ivana
3147 / 1774 / 152
Регистрация: 01.03.2013
Сообщений: 4,977
Записей в блоге: 2
27.08.2016, 21:51 #12
Цитата Сообщение от IGPIGP Посмотреть сообщение
_Ivana, я тоже ещё тот плюсовик. Но неумех не вижу.
Вот если вы начнете писать откровенные глупости менторским тоном (хотя мне тяжело вас представить в такой роли ), тогда я тоже напишу вам, что вы очередной наш человек (С) и предложу присоединиться к группе подобных гуру этого форума
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6466 / 3114 / 306
Регистрация: 04.12.2011
Сообщений: 8,588
Записей в блоге: 4
27.08.2016, 22:08 #13
Цитата Сообщение от _Ivana Посмотреть сообщение
Вот если вы начнете писать откровенные глупости менторским тоном (хотя мне тяжело вас представить в такой роли)
Не смогу. Нельзя начать что-либо дважды.
Я понял, _Ivana, это был сарказм. О менторском тоне. Я свободно могу написать что-то вроде:
Цитата Сообщение от Из упанишад
Массивы, это боевые слоны статической типизации. Эти священные животные, традиционно покрыты бронёй, цветами и матом растаптываемых врагов.
Не помню, мог ли я это где-нибудь вычитать. Всё это от того, наверное, что глядя на автоматический массив, никогда и не скажешь, что он автоматический.
0
DemolitionMan
97 / 153 / 47
Регистрация: 06.04.2016
Сообщений: 992
28.08.2016, 12:48 #14
Почему в стеке выделяется память под "обычные" переменные? Под
Цитата Сообщение от IGPIGP Посмотреть сообщение
Да все они обычные. То есть, необычные они все. На стеке создаются стековые автоматические переменные. В данном обсуждении их назвали "обычными". Обычно в этом нет ничего необычного.
- они все автоматические.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6466 / 3114 / 306
Регистрация: 04.12.2011
Сообщений: 8,588
Записей в блоге: 4
28.08.2016, 13:05 #15
Цитата Сообщение от DemolitionMan Посмотреть сообщение
- они все автоматические.
Кто же спорит. Книг полно, но если человеку не пошло и он "на пальцах" спрашивает? Ему так и объясняют. А автоматическими ещё называют переменными "на стеке", имея ввиду стековый автомат захвата-освобождения. То есть всё происходит без явного участия программиста. Поэтому, если нет уточнения в виде "статический/динамический", то говорят о автоматической. Регистровые упоминают нечасто и не на ночь. Статические имеют два контекста, класс хранения и область видимости в программе (многофайловой). То есть, если говорить строго и подробно, то ничего объяснить не удастся.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2016, 13:05
Привет! Вот еще темы с ответами:

Чем заменить calloc? - C++
Здравствуйте, подскажите, как можно заменить str2 = (char*)calloc(strlen(str1) + 1, 1); на простое выделение в С++? Пробовал так : ...

malloc vs. calloc - C++
Когда стоит использовать malloc , а когда calloc?

calloc vs malloc - C++
Объясните,пжлста,чем отличается malloc oт calloc?

Malloc / calloc - C++
здравствуйте. Интересует такой вопрос : динамическая память. Когда мы выделяем память при помощи функции malloc то нас в универе учат...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.08.2016, 13:05
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru