Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2014_2015 / LECT8_new1.pptx
Скачиваний:
27
Добавлен:
27.12.2015
Размер:
1.07 Mб
Скачать

УТЕЧКА

 

ДЕСКРИПТОРОВ:

захваченные

дескрипторы

не

возвращаются

операционной

системе.

Е

 

 

 

Е

 

 

 

УТЕЧКА ПАМЯТИ (англ. memory leak) — процесс

неконтролируемого

уменьшения объёма свободной

оперативной памяти (RAM) компьютера, связанный с ошибками в работающих программах, вовремя не освобождающих ненужные уже участки памяти, или с ошибками системных служб контроля памяти (!!! бывает, программа память «освободила», а системная служба ее не вернула – очень трудно найти такие ошибки!!!).

Динамическая память - ограниченный ресурс, управление которой обычно осуществляется библиотекой языка программирования, которая сама работает поверх динамической памяти, предоставляемой ОС.

Утечки памяти потребление памяти программой

неконтролируемо возрастает, в результате рано или поздно вступают в действие архитектурные ограничения среды исполнения (ОС, виртуальной машины, ЭВМ), и тогда новое выделение памяти становится невозможным.

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

Это может по стечению обстоятельств произойти и совсем с другой программой после того, как программа, подверженная утечкам, потребит всю память ЭВМ.

Утечки памяти происходят из-за некорректного обращения с динамической памятью (работа с массивами, структурами и объединениями). Работа с классами – то же, рассмотрим во 2 семестре.

/*1*/ char* pointer = 0; // фрагмент кода на C++

/*2*/ for( int i = 0; i < 10; i++ ) /*3*/{

/*4*/ pointer = new char[100]; /*5*/ }

/*6*/ delete [] pointer;

В этом примере на 4-й строке создается объект в динамической памяти. Код на 4-й строке выполняется 10 раз, причём каждый следующий раз адрес нового массива перезаписывает значение, хранящееся в указателе pointer. На 6-й строке выполняется удаление массива, соз-данного на последней итерации цикла. НО!!!! первые 9 остаются в динамической памяти, и одновременно в программе не остаётся переменных, которые бы хранили адреса этих массивов. Т.е. в 6-й строке невозможно ни получить доступ к первым 9 массивам, ни удалить их.

/*1*/ char* pointer = 0; // фрагмент кода на C++

/*2*/ for( int i = 0; i < 10; i++ ) /*3*/{

/*4*/ pointer = new char[100]; /*5*/ }

/*6*/ delete [] pointer;

В этом примере на 4-й строке создается объект в динамической памяти. Код на 4-й строке выполняется 10 раз, причём каждый следующий раз адрес нового массива перезаписывает значение, хранящееся в указателе pointer. На 6-й строке выполняется удаление массива, соз-данного на последней итерации цикла. НО!!!! первые 9 остаются в динамической памяти, и одновременно в программе не остаётся переменных, которые бы хранили адреса этих массивов. Т.е. в 6-й строке невозможно ни получить доступ к первым 9 массивам, ни удалить их.

РАБОТА СО СТРОКАМИ

string.h – ф-и работы со строками и памятью

Строка в С – массив символов, оканчивающийся нулем, в С++ - 2 вида: 1) аналогично С

2) класс String (II семестр) C++ 2 способа присвоения значений строкам:

1) присвоить строковой переменной строковую константу, произведя инициализацию при объявлении строки (требуется операция присваивания и строковая константа):

char stringVar[stringSize] = stringLiteral;

Пример:

char d_name[81] = "thyroid lymph node"; char patient = “Ivanov";

2) вызвать функцию, которая копирует содержимое одной строки в другую — не забывая при этом и нуль- символ (strcpy).

Она предполагает, что копируемая строка

оканчивается символом NULL и прекращает

Прототип функции strcpy:

char* strcpy(char *target, const char *source);

Функция копирует строку source в строку target, причем предполагается, что целевая строка имеет размер, достаточный для того, чтобы вместить содержимое строки-источника.

!!!ВНИМАНИЕ – ошибки, если не влезло !!!!

Пример:

char d_name[41] ;

strcpy(d_name, " thyroid lymph node "); Переменная d_name содержит строку "thyroid lymph node ".

Функция strdup копирует одну строку в другую, при этом отводит необходимое количество памяти для целевой строки.

ВНИМАНИЕ!!! Убедитесь, что оперативной памяти

char* strdup(const char *source);

Функция копирует строку source и возвращает указатель на строку-копию.

Пример

char *patient1 = “Sidorov"; char *patient2;

patient2 = strdup(patient);

После того, как будет отведено необходимое количество памяти для строки patient2, строка patient1 будет скопирована в строку patient2.

Функция strncpy - копирует заданное количество символов из одной строки в другую.

char * strncpy(char *target, const char *source, size_t num);

Функция копирует num символов из строки source в строку target. Функция не выполняет ни усечение, ни

заполнение строки.

Пример:

char str1[] = “Ivanov"; char str2[] = “Petr"; strcnpy(strl, str2, 4);

Переменная str1 содержит строку “Petrov". Заметьте, что символы ‘ov’ строки-приемника, следующий за скопированной частью строки, сохранились.

Функция strcat - последовательное присоединение строк друг к другу.

char *strcat(char *target, const char *source) ;

Функция добавляет к содержимому целевой строки содержимое строки-источника и возвращает указатель на целевую строку, предполагая, что целевая строка может вместить содержимое объединенной строки.

!!! ВНИМАНИЕ: проверьте, вдруг не влезет!!!

Пример:

char patient_name[81] ; strcpy(patient_name, "Ivanov"); strcat (string, " Petr");

Переменная patient_name содержит строку "Ivanov Petr". !!! Не забудьте пробел!!!

Ф-я strncat добавляет к содержимому целевой строки указанное количество символов из строки-источника.

char *strncat(char *target, const char *source, size_t num);

Ф-я добавляет к содержимому целевой строки target num символов из строки-источника source и возвращает указатель на целевую строку.

Пример:

char str1[81] = "patient ";

char str2[41] = "Sidorov Vasily"; strncat(strl, str2, 7);

Переменная str1 теперь содержит строку

Сравнение строк

Поскольку строки являются массивами символов, нельзя применить операцию сравнения для проверки равенства двух строк. Библиотека функций string.h предлагает набор функций для сравнения строк, которые сравнивают символы двух строк, используя для этого ASCII-коды символов: strcmp, stricmp, strncmp и strnicmp.

Вообще говоря, все функции сравнения работают одинаково: возвращают 0, если две строки совпали, отрицательную величину, если вторая строка больше по величине, и положительное значение, если большей оказалась первая строка.

Ф-я strcmp сравнивает строки str1 и str2 учетом регистра символов.

int strcmp(const char *strl, const char *str2); Возвращает целую величину:

< 0 когда strl меньше, чем str2;

Соседние файлы в папке 2014_2015