Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
1

Динамическая память new, delete

09.07.2014, 10:50. Показов 2150. Ответов 18
Метки нет (Все метки)

Всем привет!
Столкнулся с понятием "выделение динамической памяти", прочел несколько статей на эту тему и возникли вопросы:
1. В чем преимущество такого выделения памяти(приведите пример пожалуйста)
2. Как создать динамический массив? Вот так:
C++
1
2
char *p;
p = new char[5];
?
Таким образом я получаю динамический массив размером в 5 элементов?
Я вообще понял что динамический массив сам расширяет память, при добавлении в него нового элемента, например имею массив char p[] = {2,3} - и занимает он 2 байта, а затем закидываю в массив p[2] = 4, и массив становится 3 байта? Я правильно понял?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2014, 10:50
Ответы с готовыми решениями:

Указатели и динамическая память new delete
Начал работать умными указателями, в итоге как понял не сильно освоил то и Cи указатели. 1) В...

Когда высвобождается динамическая память без delete
Доброго времени суток. Прошу подсказку. Знаю что new и delete по возможности вообще нужно...

Азы: статическая память, динамическая память, автоматическая память
столько раз приходистя возвращаться к началу, и все благодаря моим преподавателям, которые не...

Статическая память,Динамическая память.
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные...

18
2723 / 1887 / 559
Регистрация: 05.06.2014
Сообщений: 5,499
09.07.2014, 10:59 2
1. В чем преимущество такого выделения памяти(приведите пример пожалуйста)
В том что размер выделенной памяти можно менять прямо во время выполнения программы.
2. Как создать динамический массив? Вот так:
C++
1
2
3
4
std::vector<char>p;
p.push_back('a');
p.push_back('b');
p.push_back('c');//итого - в массиве три элемента
Ваш вариант сам по себе размеры менять не будет.
0
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 11:01  [ТС] 3
А вектор это относится к STL библиотеке?
А для чего же тогда нужны new \delete, malloc\free? И как ими пользоватся?
0
2723 / 1887 / 559
Регистрация: 05.06.2014
Сообщений: 5,499
09.07.2014, 11:18 4
А вектор это относится к STL библиотеке?
Да.
А для чего же тогда нужны new \delete, malloc\free? И как ими пользоватся?
Для того чтобы руками рулить стратегией выделения памяти.
malloc - выделить кусок памяти.
realloc - изменить размер куска памяти.
free - освободить кусок памяти.
new - выделить кусок памяти под объект, вызвать конструктор объекта (размер куска потом менять вроде как нельзя).
delete - вызвать деструктор объекта, освободить кусок памяти.

std::vector - выделяет память. Освобождает ее только на смертном одре (когда вы выйдете из секции в которой вектор объявили). Когда вы вызываете clear вектор ничего не освобождает, а просто помечает захапанную память как личный резерв. Ну вдруг потом опять понадобится? Лечится это только регулярным ударом shrink_to_fit по голове.
0
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 11:19  [ТС] 5
Renji, Спасибо!
0
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 11:38  [ТС] 6
Добавлено через 3 минуты
Цитата Сообщение от Renji Посмотреть сообщение
1
2
3
4
std::vector<char>p;
p.push_back('a');
p.push_back('b');
p.push_back('c');//итого - в массиве три элемента
как сделать аналогисное через нью?

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    std::vector<int>A;
    A.push_back(1);
    A.push_back(2);
    A.push_back(1);
    A.push_back(1);
    A.push_back(1);
    A.push_back(1);
    A.push_back(10);
    int N = sizeof(A)/sizeof(int);
    for(int i = 0; i < N; i++)
    {
        MessageBox(_T("ok"));
    }
окошко "ok" вылзит 5 раз, хотя закинул 7 элементов, и кстати когда был только один элемент окошек по прежнему 5. Чего я не понимаю?
0
Эксперт CЭксперт С++
5065 / 2252 / 331
Регистрация: 20.02.2013
Сообщений: 5,602
Записей в блоге: 19
09.07.2014, 11:59 7
Цитата Сообщение от takhvatulin Посмотреть сообщение
как сделать аналогисное через нью?
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
/// [url]https://www.cyberforum.ru/cpp-beginners/thread1224845.html[/url]
/*
Создание динамического массива.
Код немного подправлен, но изначально честно стырен отсюда:
[url]http://code-live.ru/post/cpp-dynamic-arrays/[/url]
*/
 
// Подключаем заголовочные файлы:
#include <iostream>     // для ввода-вывода
#include <windows.h>    // для отображения русского языка
 
using namespace std;    // подключаем стандартное пространство имён
 
int main()  // функция main согласно стандарту C++ должна быть типа int
{
    SetConsoleCP(1251);       // для отображения в консоли русского языка
    SetConsoleOutputCP(1251); // для отображения в консоли русского языка
 
    int num; // размер массива
    cout << "Введите целое число: ";
    cin >> num; // получение от пользователя размера массива
 
    int *p_darr = new int[num]; // Выделение памяти для массива
 
    for (int i = 0; i < num; i++)
    {
        // Заполнение массива и вывод значений его элементов
        p_darr[i] = i+1;
        cout << "Значение " << i+1 << "-го\tэлемента (то есть, элемента p_darr["
             << i << "])\tравно\t" << p_darr[i] << endl;
    }
 
    delete [] p_darr; // очистка памяти
 
    return 0;
}
1
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 12:00  [ТС] 8
gru74ik, Спасибо!
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
09.07.2014, 12:02 9
1. Преимущество перед чем?
2. Да. Нет.
Размер динамического массива менять нельзя, под динамикой подразумевается выделение памяти в runtime.
0
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
09.07.2014, 12:05 10
Цитата Сообщение от takhvatulin Посмотреть сообщение
char p[] = {2,3}
Возьмите другой калькулятор компилятор и проверните на нем то же самое. Попробуйте.

Цитата Сообщение от Renji Посмотреть сообщение
Как создать динамический массив? Вот так:
Это не массив.
0
Эксперт CЭксперт С++
5065 / 2252 / 331
Регистрация: 20.02.2013
Сообщений: 5,602
Записей в блоге: 19
09.07.2014, 12:10 11
Можно у пользователя запросить не только произвольный размер массива, но и попросить ввести значения каждого элемента:

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
/// [url]https://www.cyberforum.ru/cpp-beginners/thread1224845.html[/url]
/*
Создание динамического массива.
Код немного подправлен, но изначально честно стырен отсюда:
[url]http://code-live.ru/post/cpp-dynamic-arrays/[/url]
*/
 
// Подключаем заголовочные файлы:
#include <iostream>     // для ввода-вывода
#include <windows.h>    // для отображения русского языка
 
using namespace std;    // подключаем стандартное пространство имён
 
int main()  // функция main согласно стандарту C++ должна быть типа int
{
    SetConsoleCP(1251);       // для отображения в консоли русского языка
    SetConsoleOutputCP(1251); // для отображения в консоли русского языка
 
    int num; // размер массива
    cout << "Введите размер массива (любое положительное целое число): ";
    cin >> num; // получение от пользователя размера массива
    cout << endl;
 
    int *p_darr = new int[num]; // Выделение памяти для массива
 
    for (int i = 0; i < num; i++)
    {
        cout << "Введите значение " << i+1 << "-го элемента массива: ";
        // Получение от пользователя значений элементов массива
        cin >> p_darr[i];
    }
 
    cout << endl;
 
    for (int i = 0; i < num; i++)
    {
        // Вывод значений его элементов
        cout << "Значение " << i+1 << "-го\tэлемента, то есть, элемента p_darr["
             << i << "]\tравно\t" << p_darr[i] << endl;
    }
    delete [] p_darr; // очистка памяти
 
    return 0;
}
0
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 12:13  [ТС] 12
Цитата Сообщение от castaway Посмотреть сообщение
Преимущество перед чем?
Да не то чтобы перед чем, а вообще в каких случаях удобно выделять память динамически. Мне тут сказали уже, что когда я сам захочу рулить памятью, но вопрос для чего мне понадобится самостоятельно память выделять?
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
09.07.2014, 12:20 13
Случаев миллионы. Если размер массива будет известен только во время выполнения программы тогда тебе придётся выделить память динамически
0
Модератор
Эксперт С++
11129 / 9168 / 5505
Регистрация: 18.12.2011
Сообщений: 24,490
09.07.2014, 12:21 14
Цитата Сообщение от takhvatulin Посмотреть сообщение
int N = sizeof(A)/sizeof(int);
for(int i = 0; i < N; i++)
С контейнерами так не обращаются.
Для этого существуют итераторы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
using namespace std;
int main()
{
 
    vector<int>A;
    A.push_back(1);
    A.push_back(2);
    A.push_back(1);
    A.push_back(1);
    A.push_back(1);
    A.push_back(1);
    A.push_back(10);
    vector<int>::iterator itE=A.end();
    vector<int>::iterator itB=A.begin();
    for(;itB!=itE; ++itB)
        cout<<*itB<<' ';
    cout<<endl;
    system("pause");
    return 0;
}
0
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 12:21  [ТС] 15
Цитата Сообщение от zss Посмотреть сообщение
С контейнерами так не обращаются.
Ясно, пойду читать теорию)) Спасибо за ответы!
0
Эксперт CЭксперт С++
5065 / 2252 / 331
Регистрация: 20.02.2013
Сообщений: 5,602
Записей в блоге: 19
09.07.2014, 12:22 16
Цитата Сообщение от takhvatulin Посмотреть сообщение
в каких случаях удобно выделять память динамически
Когда заранее неизвестен размер массива. Вот в приведённом мной коде, например, размер массива задаёт пользователь. А ты, программер, хотя и даёшь ему своим кодом эту возможность, но при этом (поскольку ты не телепат и не ясновидящий) какое число пользователь введёт, ты не знаешь.
В случае статического массива, программа сама знает когда и сколько памяти выделить, потому что заранее известно количество элементов. А в случае динамического массива (когда количество элементов массива заранее неизвестно), память нужно специально выделять ручками с помощью оператора new а потом очищать с помощью оператора delete.
А тем, кому это лениво, пользуются более удобным аналогом динамического массива - шаблонным контейнером vector.
0
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 12:24  [ТС] 17
gru74ik, Ок, понял.
0
15140 / 8133 / 1966
Регистрация: 30.01.2014
Сообщений: 13,833
09.07.2014, 16:45 18
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Возьмите другой компилятор и проверните на нем то же самое. Попробуйте.
Вполне легальная запись. За исключением того, что это все-таки не расширяемый динамически массив, как думал автор
1
Модератор
Эксперт по электронике
8495 / 6321 / 855
Регистрация: 14.02.2011
Сообщений: 21,916
09.07.2014, 16:53 19
Цитата Сообщение от gru74ik Посмотреть сообщение
/*
Создание динамического массива.
ты путаешь динамическое выделение памяти и динамический массив
динамический массив это vector или CArray в MFC
массив который может изменить размер
например выделили массив под 10 элементов, а потом оказалось что нужно сто
пара движений руками (а у CArray даже этого не надо) и массив стал на 100 элементов
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2014, 16:53

delete[] не освобождает память?
Приветствую! Такая проблема - имеется функция которая должна заменить строку другой строкой по...

Динамическая память
Помогите перевести массивы в динамическую память пожалуйста + почему-то не работает запись в...

Динамическая память
Есть 2 массива одной размерности: int *m1 = new int , *m2 = new int ; где N, M некие...

Динамическая память
Всем привет!!! взникла проблема с выполнением строки K=A++; при выполнении...


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

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

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