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

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

Войти
Регистрация
Восстановить пароль
 
 
takhvatulin
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
#1

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

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

Всем привет!
Столкнулся с понятием "выделение динамической памяти", прочел несколько статей на эту тему и возникли вопросы:
1. В чем преимущество такого выделения памяти(приведите пример пожалуйста)
2. Как создать динамический массив? Вот так:
C++
1
2
char *p;
p = new char[5];
?
Таким образом я получаю динамический массив размером в 5 элементов?
Я вообще понял что динамический массив сам расширяет память, при добавлении в него нового элемента, например имею массив char p[] = {2,3} - и занимает он 2 байта, а затем закидываю в массив p[2] = 4, и массив становится 3 байта? Я правильно понял?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2014, 10:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическая память new, delete (C++):

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

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

Динамическая память - C++
Всем привет!!! взникла проблема с выполнением строки K=A++; при выполнении printf("\n__________ %d\n",K.gasaaa()); получаю левые...

Динамическая память - C++
Помогите перевести массивы в динамическую память пожалуйста + почему-то не работает запись в файл(не перезаписывает). #include <iostream>...

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

Динамическая память - C++
Создать одномерный массив в котором хранятся года рождения людей (года вводятся в массив в ручную, размер массива не менее 5). Определить...

18
Renji
2000 / 1368 / 308
Регистрация: 05.06.2014
Сообщений: 3,899
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
takhvatulin
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 11:01  [ТС] #3
А вектор это относится к STL библиотеке?
А для чего же тогда нужны new \delete, malloc\free? И как ими пользоватся?
0
Renji
2000 / 1368 / 308
Регистрация: 05.06.2014
Сообщений: 3,899
09.07.2014, 11:18 #4
А вектор это относится к STL библиотеке?
Да.
А для чего же тогда нужны new \delete, malloc\free? И как ими пользоватся?
Для того чтобы руками рулить стратегией выделения памяти.
malloc - выделить кусок памяти.
realloc - изменить размер куска памяти.
free - освободить кусок памяти.
new - выделить кусок памяти под объект, вызвать конструктор объекта (размер куска потом менять вроде как нельзя).
delete - вызвать деструктор объекта, освободить кусок памяти.

std::vector - выделяет память. Освобождает ее только на смертном одре (когда вы выйдете из секции в которой вектор объявили). Когда вы вызываете clear вектор ничего не освобождает, а просто помечает захапанную память как личный резерв. Ну вдруг потом опять понадобится? Лечится это только регулярным ударом shrink_to_fit по голове.
0
takhvatulin
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 11:19  [ТС] #5
Renji, Спасибо!
0
takhvatulin
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
gru74ik
Эксперт CЭксперт С++
4196 / 1844 / 198
Регистрация: 20.02.2013
Сообщений: 4,991
Записей в блоге: 22
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]http://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
takhvatulin
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 12:00  [ТС] #8
gru74ik, Спасибо!
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
09.07.2014, 12:02 #9
1. Преимущество перед чем?
2. Да. Нет.
Размер динамического массива менять нельзя, под динамикой подразумевается выделение памяти в runtime.
0
SatanaXIII
Супер-модератор
Эксперт С++
5619 / 2654 / 247
Регистрация: 01.11.2011
Сообщений: 6,553
Завершенные тесты: 1
09.07.2014, 12:05 #10
Цитата Сообщение от takhvatulin Посмотреть сообщение
char p[] = {2,3}
Возьмите другой калькулятор компилятор и проверните на нем то же самое. Попробуйте.

Цитата Сообщение от Renji Посмотреть сообщение
Как создать динамический массив? Вот так:
Это не массив.
0
gru74ik
Эксперт CЭксперт С++
4196 / 1844 / 198
Регистрация: 20.02.2013
Сообщений: 4,991
Записей в блоге: 22
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]http://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
takhvatulin
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 12:13  [ТС] #12
Цитата Сообщение от castaway Посмотреть сообщение
Преимущество перед чем?
Да не то чтобы перед чем, а вообще в каких случаях удобно выделять память динамически. Мне тут сказали уже, что когда я сам захочу рулить памятью, но вопрос для чего мне понадобится самостоятельно память выделять?
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
09.07.2014, 12:20 #13
Случаев миллионы. Если размер массива будет известен только во время выполнения программы тогда тебе придётся выделить память динамически
0
zss
Модератор
Эксперт С++
6536 / 6098 / 2008
Регистрация: 18.12.2011
Сообщений: 15,863
Завершенные тесты: 1
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
takhvatulin
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 12:21  [ТС] #15
Цитата Сообщение от zss Посмотреть сообщение
С контейнерами так не обращаются.
Ясно, пойду читать теорию)) Спасибо за ответы!
0
09.07.2014, 12:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2014, 12:21
Привет! Вот еще темы с ответами:

Динамическая память - C++
Как создать массив A через динамическую память ???

Динамическая память - C++
в чем ошибка #include &lt;iostream&gt; #include &quot;conio.h&quot; using namespace std; class{A int a; double b; char s; }

Динамическая память - C++
Надо ввести массив из файла. Сам массив хранится в динамической памяти. Сколько я над прогой не бился, а вводит данные криво. С...

Динамическая память - C++
Каким способом можно задать динамическую память , кроме как через new ?


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

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

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