Программирование >>  Программирование на языке c++ 

1 ... 15 16 17 [ 18 ] 19 20 21 ... 159


delete c;

delete [] f; эта форма используется для массивов

Как и выще, префикс :: гарантирует использование глобальной версии оператора delete.

Когда удаляется объект нового типа, заданного пользователем, то вызывается деструктор соответствующего класса.

По аналогии с оператором new оператор delete вызывает функцию operator delete() (см. гл. 5).

В заключение рассмотрим два примера, демонстрирующие использование операторов new и delete.

#include <iostream.h>

int fO(void) { return 5; } простейшая функция fO int f1(void) { return 10; } простейшая функция f1 int f2(void) { return 15; } простейшая функция f2

void main(void)

{ long* I;

I = new long (123456L);

cout *l endl; результат: 123456 delete I; удаление объекта *l

class my class {

new (float(*[7])());

Оператор delete также имеет один операнд (это унарный оператор). И его тоже можно записать в двух формах:

<::> delete cast expression обычная форма

<::> delete[] cast expression форма для массивов

Результат выполнения оператора имеет тип void. Единственный операнд этого оператора (cast expression) должен быть указателем, возвращенным предшествующим оператором new. Если приложить оператор delete к указателю, полученному не от оператора new, то результат будет непредсказуемым и в больщинстве случаев ошибочным. Рассмотрим примеры:

char* с = new char;, float* f = new float[150];




Точки входа, с которых начинается выполнение функ1щи

Память, выделенная new

ncw(inl(f3])())

new возвращает это значение, которое записывается в f

int ССОХ)

Рис. 2.2. Выделение памяти для массива f указателей на функции и использование этого массива. Здесь f- указатель на массив, но по правилам языков C/C++ его можно использовать и как имя массива

char* р;

public:

my cla88(char* Р) : р(Р) {} это конструктор char* dl8play(void) { return р; } } *Р ~ W my class( University of Aveiro ); nepe- лпчп в конструктор строки University of Avoiro

cout p c->di.splay() << endl; результат:



University of Aveiro delete p c; удаление объекта *p c int (*(*f)){) = new (int (*[3])()); f ниже будет использоваться как массив из трех указателей на функции (см. рис. 2.2) f[0] = fO; f[1] = f1; f[2] = f2;

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

cout f[i]() \t; результат: 5 10 15 delete [] f;

Пример, приведенный ниже, показывает, как можно выделить память для двухмерного массива, который в языках C/C++ представляется в виде массива одномерных массивов (рис. 2.3). Ниже array - это имя массива одномерных массивов, т. е. имя массива указателей на одномерные массивы.

#include <iostream.h> void main(void)

{ int **array; array - указатель на указатель

array = new int*[3]; array - указатель на массив for(int i=0;i<3;i+-b) указателей на одномерные массивы array[i] = new int[4]; каждый i-й элемент массива указывает на одномерный

имена одномерных массивов I

имя двухмерного массива

array

array[21

Р1[!1

(21И

Pl[31

аггау[11

[ИЮ]

♦array[0]

mil)

В языках С/С+-+- двухмерный массив представляется как

указатель на массив указателен

массив указателей на одномерные одномерный массив массивы ;-

I одномерных массивов [

Рис. 2.3. Структура двухмерного массива в языках C/C++



1 ... 15 16 17 [ 18 ] 19 20 21 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика