ҚАЗАҚСТАН РЕСПУБЛИКАСЫ БІЛІМ ЖӘНЕ ҒЫЛЫМ МИНИСТРЛІГІ «Ғ.ДАУКЕЕВ АТЫНДАҒЫ АЛМАТЫ ЭНЕРГЕТИКА ЖӘНЕ БАЙЛАНЫС УНИВЕРСИТЕТІ» Коммерциялық емес акционерлік қоғам
№6 ЗЕРТХАНАЛЫҚ ЖҰМЫс
Пәні: ЖҮЙЕЛІК ПРОГРАММАЛЫҚ ЖАБДЫҚТАУ ЖӘНЕ ПРОГРАММАЛАУ
Орындаған: Серіков Алишер
Тобы: АИСУк-20-6
Тексерген: Абдилдаева А
________ ____________ «___» ___________2022г.
(бағасы) (қолы)
Алматы 2022
Лабораторная работа: Динамическое выделение памяти и исключения в С++ Цель работы: 1) изучить менеджер памяти С++ 2) изучить различные способы обработки исключений; 3) получить практические навыки программирования задач с выделением памяти и обработкой исключений. Теоретические сведения
class A
{
public:
A(int x){}
~A(){}
};
const int n = 50;
A* placementMemory = static_cast(operator new[] (n * sizeof(A)));
for (int i = 0; i < n; i++) {
new (placementMemory + i) A(rand()); //здесь память для объекта не выделяется, но инициализируется
}
//!!деинициализация памяти
for (int i = 0; i < n; i++)
{
placementMemory[i].~A();
}
operator delete[] (placementMemory);
int *p_var = NULL; // объявление нового указателя
p_var = new int; // память динамически выделяется
/* .......
остальной код
........*/
delete p_var; // память освобождается
p_var = NULL; // указатель заменяется на 0 (нуль-указатель)
Массивы, созданные (выделенные) при помощи new [], аналогичным образом должны быть уничтожены (оcвобождены) при помощи delete []:
int size = 10;
int *p_var = NULL; // объявление нового указателя
p_var = new int [size];// память динамически выделяется
/* .......
остальной код
........*/
delete [] p_var; // память освобождается
p_var = NULL; // указатель заменяется на 0 (нуль-указатель)
vect::vect(int n)
{ if (n < 1)
throw(n);
p = new int[n];
if (p == 0)
throw("FREE STORE EXHAUSTED");
}
void g()
{ try { vect a(n), b(n);
...
}
catch(int n) { ... } //отслеживает все неправильные размеры
catch(char* error) {...} //отслеживает превышение свободной памяти
}
enum error {bounds, heap, other};
class vect_error
{ private:
error e_type;
int ub, index, size;
public:
vect_error(error, int, int); //пакет вне заданных пределов
vect_error(error, int); //пакет вне памяти
catch (...) //действие по умолчанию
#include "vect.h"
void g(int n)
{ try {
// блок try - контекст для принятия решения о том, какие
// обработчики вызываются для установленного исключения
vect a(n);
}
catch (int n) // обработчик
{
cerr << "SIZE ERROR " << n << endl;
g(10);
}
catch (const char* error) // обработчик