Навигация
Главная
Поиск
Форум
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
Реклама
Сейчас на сайте
Гостей: 4
На сайте нет зарегистрированных пользователей

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

Обратное размещение элементов ЭВС на Delphi + Пояснительная записка
Моделирование регулировочного участка цеха на GPSS + Пояснительная записка
Изменения контуров и сортировка в двумерном массиве чисел на Turbo Pasca...

Операторы класса 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 Комментариев · 25394 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Распознавание тек...
Crypt32
KOL & MCK v1.69
Java 2 - Эффектив...
Основы Delphi. Пр...
ЯЗЫК ПРОГРАММИРОВ...
C# Учебный курс
Delphi. Учимся на...
netBIOS
Swing. Эффектные...
Самоучитель Прогр...
PDJ Scrollers
AboutSystem
CoolDev TipsSyste...
Rotolabel
Искусство програм...
Заставка. Изображ...
Трассировка прово...
Программирование ...
Разработка клиент...

Топ загрузок
Приложение Клие... 100800
Delphi 7 Enterp... 98063
Converter AMR<-... 20302
GPSS World Stud... 17067
Borland C++Buil... 14261
Borland Delphi ... 10388
Turbo Pascal fo... 7398
Калькулятор [Ис... 6093
Visual Studio 2... 5241
Microsoft SQL S... 3676
Случайные статьи
Основные понятия и...
Драйверы для много...
7.1. Основы мастер...
Как работает GZIP ...
Содержание
ДОПУСТИМЫЕ СПОСОБЫ...
Активный маршрутиз...
6. Локальная групп...
Предисловие
Параметры протокол...
4.1. Двоичный поис...
Сегментирование кл...
7 основных стратег...
Проверка символьны...
Положение Acompli
Игра «Выдающийся ум»
Другие «примочки»
Разработать прикл...
Польза гвоздики
Пример 1. Формулир...
Упражнения
Создаем многопоточ...
Ускоренное деление
Невозможность созд...
Знайте, что вы ищете
Статистика



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


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