Главная
Регистрация
Вход
Суббота
23.11.2024
05:51
Приветствую Вас, Гость | RSS

Меню сайта

Друзья сайта

Категории раздела
1. Основы работы в среде C++ Builder.Основы языка Си++ [9]
2. Операторы ветвления и операторы передачи управления [4]
3. Операторы цикла и операторы передачи управления [5]
4. Одномерные массивы [3]
5. Многомерные массивы [3]
6. Указатели.Динамическое распределение памяти [6]
7. Отладка программы [3]
8. Функции [8]
9. Строки [5]
10. Функция Main [2]
11. Типы данных,определяемые пользователем [5]
12. Потоки ввода/вывода [7]
13. Основы объектно-ориентированного программирования [5]
Приложения [11]

Форма входа

Наш опрос
Оказался ли Вам полезным наш сайт?
Всего ответов: 464

Пользователи

Онлайн всего: 13
Гостей: 13
Пользователей: 0

 Каталог статей 
Главная » Статьи » Лекции по C++ » 6. Указатели.Динамическое распределение памяти

PDA-версия страницы

5. Использование операторов new и delete

Операторы new и delete могут быть использованы везде, где используются функции malloc и free. Однако этот способ имеет несколько преимуществ:

не нужно включать в программу файл malloc.h;

не нужно выполнять приведение типов – это сделает оператор new;

самое главное, эти операторы не просто выделяют и освобождают память. Когда оператор new используется для размещения объекта в памяти, он автоматически вызывает конструктор объекта, если таковой существует. Аналогично, при освобождении памяти с помощью оператора delete вызывается деструктор объекта (также при его наличии).

Выделение памяти с помощью оператора new имеет следующий синтаксис:

указатель = new тип;

указатель = new тип [число элементов];


Вторая строка описывает синтаксис оператора при выделении памяти для массивов.

Так же как функция malloc, оператор new возвращает значение NULL, если объем требуемой памяти больше, чем объем свободной. Рекомендуется проверить факт выделения памяти прежде, чем продолжать выполнение программы.

Освобождение памяти с помощью оператора delete производится только в том случае, если она была выделена с использованием оператора new и имеет следующий синтаксис:

delete указатель;

delete [число элементов] указатель;


Использование квадратных скобок для освобождения памяти, выделенной под массив, обязательно. Как и при инициализации, его длину можно опустить, но скобки опускать нельзя, иначе освободится память, занимаемая только первым элементом. Указатель на константу удалить нельзя.

Рассмотрим программу, ввода/вывода одномерного массива:

int n;

float *massiv;      //объявление указателя

cout<<RUS("Введите размер массива\n");cin>>n;//ввод размера массива

massiv=new float[n];//динамическое выделение памяти

if(!massiv)                              //проверка факта выделения памяти

{cout<<RUS("\nНедостаточно памяти");

 cout<<RUS("\nНажмите любую клавишу для завершения программы ...\n");

 getch();

 return 0;}

cout<<RUS("Введите massiv[")<<n<<"]"<<"\n";

for(int i=0;i<n;i++)

cin>>*(massiv+i);

//вывод массива

cout<<"\nmassiv\n";

for(int i=0;i<n;i++)

cout<<"    "<<*(massiv+i);

delete [] massiv; //освобождение памяти


 

В этой программе указатель используется для выделения динамической памяти и доступа к элементам массива.

Способ выделения памяти под двумерный массив, когда обе его размерности задаются на этапе выполнения программы, приведен ниже:

int nstr,nstb;

cout<<RUS(" Количество строк = ");cin>>nstr;          //ввод кол. строк

cout <<RUS(" Количество столбцов = ");cin>>nstb;  //ввод кол. столбцов

//динамическое выделение памяти

int **a=new int *[nstr];//оператор 1

for(int i=0;i<nstr;i++)   //оператор 2

a[i]=new int[nstb];        //оператор 3

if(!a) //проверка факта выделения памяти

{cout<<RUS("\nНедостаточно памяти");

 cout<<RUS("\nНажмите любую клавишу для завершения программы ...\n");

 getch();

 return 0;}

//ввод массива

cout<<RUS("\nВведите массив[")<<nstr<<"]["<<nstb<<"]\n";

for(int i=0;i<nstr;i++)

 for(int j=0;j<nstb;j++) cin>>a[i][j]; //оператор 3

//вывод массива

cout<<RUS("Массив a\n");

for(int i=0;i<nstr;i++)

{

for(int j=0;j<nstb;j++)

{cout.width(5);cout<<a[i][j];}

cout<<"\n";

}

delete [] a; //освобождение памяти



Рис. 1.2. Выделение памяти под двумерный массив


В операторе 1 объявляется переменная типа «указатель на указатель на int» и выделяется память под массив указателей на строки массива (количество строк – nstr). В операторе 2 организуется цикл для выделения памяти под каждую строку массива. В операторе 3 каждому элементу массива указателей на строки присваивается адрес начала участка памяти, выделенного под строку двумерного массива. Каждая строка состоит из nstb элементов типа int (рис. 1.2).

Освобождение памяти из-под массива с любым количеством измерений выполняется с помощью операции:

 delete [] указатель.
Категория: 6. Указатели.Динамическое распределение памяти | Добавил: Admin (01.09.2011)
Просмотров: 13103 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Помочь сайту!
рублей WMR
WebMoney на кошелек R407507742179

Партнёры сайта

Закладки

Поиск по сайту

Copyright H-L-L.RU © 2024
Сделать бесплатный сайт с uCoz