Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Результат_2012_02_09.docx
Скачиваний:
6
Добавлен:
20.04.2015
Размер:
593.36 Кб
Скачать

­Содержание Введение

Один из основных языков программирования является язык С и С++. В нем есть много элементов, которые позволяют быстро и эффективно решать поставленные задачи.

Выписка из ГОС ВПО

ОПД. Программирование на языках высокого уровня:

Ф.05Основные этапы решения задач на ЭВМ; критерии качества программы; жизненный цикл программы; постановка задачи и спецификация программы; способы записи алгоритма; программа на языке высокого уровня; стандартные типы данных; представление основных управляющих структур программирования; теорема структуры и структурное программирование; анализ программ; утверждения о программах; корректность программ; правила вывода для основных структур программирования; инвариантные утверждения; процедуры и функции; массивы; утверждения о массивах; записи; файлы; индуктивные функции на последовательностях (файлах, массивах); динамические структуры данных; линейные списки: основные виды и способы реализации; линейный список как абстрактный тип данных; модульные программы; рекурсивные определения и алгоритмы; программирование рекурсивных алгоритмов; способы конструирования и верификации программ.

Задача 1: Обнаружить учетку памяти

Рассуждения:

  1. Следует отметить, что С++ обладает необходимостью контроля памяти, которая без дополнительных модулей, как правило, возлагается на программиста. Программист должен следить за тем, что бы выделять необходимый размер памяти для данных, освобождать ту память, которую выделил. Если программист забудет освободить память, выделенную им, то это приведет к учетке памяти. Самое плохое для начинающих программистов заключается в том, что при утечке памяти программа часто работает. И перестанет она работать только когда закончатся ресурсы системы. Поэтому возникает вопрос об автоматическом нахождении утечек памяти.

  2. К счастью, в Visual Studio 2010 эта возможность предусмотрена. Мы не будем углубляться в то, как это устроено, просто воспользуемся предлагаемым решением.

#include <crtdbg.h>

#include <iostream>

using namespace std;

int main(int argc, char * argv[]) {

_CrtSetDbgFlag(33);

int size;

cin >> size;

int *a = new int[size];

return 0;

}

  1. Суть программы проста – мы вводим корректно число с клавиатуры, потом выделяем память под массив нужного размера и «забываем» ее освободить. После запуска программы и ее завершения в окне «Output» мы увидем следующие надписи:

  1. Самая главная из них – Detected memory leaks. Это означает, что в программе есть утечка памяти. В данном случае её размер равен 16 байтам. Конечно, в данной программе легко догадаться, где находится утечка памяти. Однако в больших программах это сделать не так просто. Поэтому можно еще улучшить программу:

#include <crtdbg.h>

#include <iostream>

using namespace std;

#ifdef _DEBUG

#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)

#define new DEBUG_NEW

#endif

int main(int argc, char * argv[]) {

_CrtSetDbgFlag(33);

int size;

cin >> size;

int *a = new int[size];

return 0;

}

  1. После запуска этой программы мы уже увидем более полное сообщение об утечке памяти

Теперь в нем вижно не только факт утечки памяти, но и имя файла, и номер строки в нем, где была выделена память, которая не была удалена. Именно этот способ самый удобный.

  1. Приведем пример верной программы, в которой нет учетки памяти.

#include <crtdbg.h>

#include <iostream>

using namespace std;

#ifdef _DEBUG

#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)

#define new DEBUG_NEW

#endif

int main(int argc, char * argv[]) {

_CrtSetDbgFlag(33);

int size;

cin >> size;

int *a = new int[size];

delete[] a;

return 0;

}

После запуска данной программы в окне output надписи «Detected memory leaks» не будет, потому что есть операция освобождения памяти, и утечки памяти нет. Следует отметить, что если память выделялась через операцию new … [] , то удаляться эта память должна через delete [], а если память выделялась через операцию new «без квадратных скобок», то и удаляться она должена через операцию delete «без квадратных скобок».