Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 8
На сайте нет зарегистрированных пользователей

Пользователей: 13,361
новичок: uehuat
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

База данных - словарь терминов на Delphi + Пояснительная записка
Моделирование станции технического обслуживания на GPSS + Отчет
Файл записей с выводом обратного заголовка на Turbo Pascal

Операторы класса new и delete


Оператор new – это универсальный оператор, получающий память у операционной системы и возвращающий указатель на начало выделенного блока. Для освобождения выделенных участков памяти и возврата их операционной системе используется оператор delete. Причем освобождение памяти не подразумевает удаление указателя, связанного с этим блоком памяти; это и не изменение адреса значения, на которое указывает указатель. Однако этот указатель не имеет силы. Память, на которую он указывает, может быть применена для других целей.
Оператор new очень часто используется в конструкторах классов, а delete соответственно в деструкторах.
Указатели могут указывать на объекты так же, как и на простые типы данных и массивы. Например:

#include <iostream>

using namespace std;

class Distance

{

private:

int feet;

float inches;

public:

void GetDist()

{

cout <<”Введите футы”;

cin >> feet;

cout <<”Введите дюймы”;

cin >> inches;

}

void ShowDist()

{ cout << feet << “\’-“ << inches<<’\”’; }

};



int main()

{

Distance Dist; //создаем объект типа Distance

Dist.GetDist(); //получаем данные

Dist.ShowDist(); //отображаем данные на мониторе

//создаем указатель на объект типа Distance

Distance* pDist;

pDist = new Distance(); //создаем объект Distance

pDist->GetDist(); //получаем данные

pDist->ShowDist();//отображаем данные на мониторе



if (pDist) delete pDist; //освобождаем память

return 0;

}




Иногда может встретиться другой более общий способ применения операции new для выделения памяти для объектов. Так как new возвращает указатель на блок памяти, содержащий объект, то мы имеем возможность обратиться к первоначальному объекту путем разыменования указателя. Например, можно переписать функцию main следующим образом:

i
nt main()
{
//создаем объект типа Distance
Distance& Dist = *(new Distance);
Dist.GetDist(); //доступ к членам класса
//осуществляем через оператор “.”
Dist.ShowDist(); //отображаем данные на мониторе

return 0;
}





Выражение new Distance возвращает указатель на блок памяти, достаточный для размещения объекта Distance, и мы можем обратиться к первоначальному объекту, используя *(new Distance).
На этот объект указывает указатель. Используя ссылку, мы определили Dist как объект класса Distance и определили его равным *(new Distance). Теперь мы можем ссылаться на члены объекта Dist, используя операцию точки . , а не операцию ->.
Этот подход используется реже, чем указатели на объекты, полученные с использованием операции new, но он работает точно так же.
Способом, аналогичным вышеописанному, выделяется память и под массивы объектов. Например:


//создаем массив из 7 элементов типа Distance
Distance DistMas[7];

//обращаемся к методу 3-го элемента массива
DistMas[2].ShowDist();

//создаем массив из 5 указателей на Distance
Distance *pDistMas[5];
for (int i=0; i<5; i++)
{
//создаем объект типа Distance
pDistMas[i] = new Distance;
//обращаемся к методу i-го элемента массива
pDistMas[i]->GetDist();
}






Отметим, что в этом случае удалить созданный нами с помощью оператора new массив указателей, просто вызвав
delete []pDistMas;



нельзя. Так как эта запись удалит массив указателей, но не объекты, на которые они указывают. Поэтому мы должны вызвать каждый элемент массива и применить к нему оператор delete:

for (i=0; i<5; i++)
delete pDistMas[i];




Класс может предусматривать применение своих собственных вариантов операторов new и delete. При этом
• - функция тип_класса::operator new будет вызываться всякий раз, когда создается динамический объект;
• - функция тип_класса::operator new[] будет вызываться всякий раз, когда создается динамический массив объектов;
• - функция тип_класса::operator delete будет вызываться вся-кий раз, когда уничтожается динамический объект;
• - функция тип_класса::operator delete [] будет вызываться вся-кий раз, когда уничтожается динамический массив объектов.
Например:

class X
{

public:
void *operator new(long sz){return myalloc(sz); };
void *operator delete(X *p) { myfree(p); };
X(){/*Инициализация*/};

}




Для объектов класса X вместо операторов new и delete будут использоваться X::operator new и X::operator delete. Глобальный оператор new, как и прежде, может использоваться для выделения памяти для объектов других типов.
Опубликовал Kest July 28 2010 11:48:48 · 0 Комментариев · 24720 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
45 уроков по дельфи
Простой пример ка...
CodeGear RAD Stud...
Delphi 7 Enterpri...
Delphi Russian Kn...
Пример работы с б...
Шейдеры в Delphi
С/C++ Программиро...
Ведение справочны...
Abbrevia
Программирование ...
Delphi 6. Учебный...
C++ : библиотека ...
PRNDbgrid
AdBlaster v2.5 - ...
ComboBox97
DiskInfo
Prolog Interprete...
FreeSMS v1.3.1
TDBF

Топ загрузок
Приложение Клие... 100772
Delphi 7 Enterp... 97809
Converter AMR<-... 20260
GPSS World Stud... 17014
Borland C++Buil... 14189
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5972
Visual Studio 2... 5206
Microsoft SQL S... 3661
Случайные статьи
Настройка параметр...
Общие характеристи...
ГЕНОЛОГ
Текстовый семибито...
Введение в регуляр...
Положение Acompli
Основные сведения ...
Виртуальные машины
Аппарат Fruit Cock...
Structure too large
Колонки таблицы, с...
Кузовной ремонт в ...
Способы обнаружени...
• Решите, какой IP...
African vases
Когда тепловая волна
Язык С: ассоциатив...
чтения смарт-карт,...
Запись текста в до...
107.2.
"[" or "(." expected
Переключатель Micr...
Заключение
Ошибка TACTIVEFORM...
Несколько примеров...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?