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

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

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

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

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

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

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

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

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

malloc и new (динамическая память) - C++
Ребят, привет. ОЧчень интересует вопрос с динамической памятью . Как эта штука реализованна внутри ? я понимаю, что процессу выделяется в...

Деструктор и динамическая память - C++
Вечер добрый, форумчане. Создал класс с матрицами, динамически выделил память. Конструктор копии вроде правильный, деструктор тоже, но...

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

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

std::vector - выделяет память. Освобождает ее только на смертном одре (когда вы выйдете из секции в которой вектор объявили). Когда вы вызываете clear вектор ничего не освобождает, а просто помечает захапанную память как личный резерв. Ну вдруг потом опять понадобится? Лечится это только регулярным ударом shrink_to_fit по голове.
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 11:19  [ТС]     Динамическая память new, delete #5
Renji, Спасибо!
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 11:38  [ТС]     Динамическая память new, delete #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. Чего я не понимаю?
gru74ik
Модератор
Эксперт CЭксперт С++
4108 / 1753 / 197
Регистрация: 20.02.2013
Сообщений: 4,859
Записей в блоге: 21
09.07.2014, 11:59     Динамическая память new, delete #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;
}
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 12:00  [ТС]     Динамическая память new, delete #8
gru74ik, Спасибо!
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
09.07.2014, 12:02     Динамическая память new, delete #9
1. Преимущество перед чем?
2. Да. Нет.
Размер динамического массива менять нельзя, под динамикой подразумевается выделение памяти в runtime.
SatanaXIII
Супер-модератор
Эксперт С++
5604 / 2638 / 242
Регистрация: 01.11.2011
Сообщений: 6,497
Завершенные тесты: 1
09.07.2014, 12:05     Динамическая память new, delete #10
Цитата Сообщение от takhvatulin Посмотреть сообщение
char p[] = {2,3}
Возьмите другой калькулятор компилятор и проверните на нем то же самое. Попробуйте.

Цитата Сообщение от Renji Посмотреть сообщение
Как создать динамический массив? Вот так:
Это не массив.
gru74ik
Модератор
Эксперт CЭксперт С++
4108 / 1753 / 197
Регистрация: 20.02.2013
Сообщений: 4,859
Записей в блоге: 21
09.07.2014, 12:10     Динамическая память new, delete #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;
}
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 12:13  [ТС]     Динамическая память new, delete #12
Цитата Сообщение от castaway Посмотреть сообщение
Преимущество перед чем?
Да не то чтобы перед чем, а вообще в каких случаях удобно выделять память динамически. Мне тут сказали уже, что когда я сам захочу рулить памятью, но вопрос для чего мне понадобится самостоятельно память выделять?
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
09.07.2014, 12:20     Динамическая память new, delete #13
Случаев миллионы. Если размер массива будет известен только во время выполнения программы тогда тебе придётся выделить память динамически
zss
Модератор
Эксперт С++
6322 / 5906 / 1913
Регистрация: 18.12.2011
Сообщений: 15,189
Завершенные тесты: 1
09.07.2014, 12:21     Динамическая память new, delete #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2014, 12:21     Динамическая память new, delete
Еще ссылки по теме:

Задачка: Динамическая память - C++
Задачка: В динамическую память занести набор введенных с клавиатуры длинных целых натуральных чисел (признак завершения ввода - число...

Указатели и динамическая память - C++
Не могу немного понять, допустим, я хочу создать массив, зачем мне под него выделять память, почему нельзя создать указатель,...

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

Динамическая память и массивы - C++
Всем доброе утро . Решил по практиковаться и задался вопросом у меня есть массив a; как ему динамическую память выделить? как понял...


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

Или воспользуйтесь поиском по форуму:
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 140
09.07.2014, 12:21  [ТС]     Динамическая память new, delete #15
Цитата Сообщение от zss Посмотреть сообщение
С контейнерами так не обращаются.
Ясно, пойду читать теорию)) Спасибо за ответы!
Yandex
Объявления
09.07.2014, 12:21     Динамическая память new, delete
Ответ Создать тему
Опции темы

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