Лабораторная работа: Динамическое выделение памяти и исключения в С++



Дата08.11.2022
өлшемі24,2 Kb.
#156927
түріЛабораторная работа
Байланысты:
Зертханалық жұмыс №6 Серіков Алишер


ҚАЗАҚСТАН РЕСПУБЛИКАСЫ БІЛІМ ЖӘНЕ ҒЫЛЫМ МИНИСТРЛІГІ
«Ғ.ДАУКЕЕВ АТЫНДАҒЫ АЛМАТЫ ЭНЕРГЕТИКА ЖӘНЕ БАЙЛАНЫС УНИВЕРСИТЕТІ»
Коммерциялық емес акционерлік қоғам

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) // обработчик

{ if(n < 1) // оговоренное предусловие


throw (n); // устанавливается исключение

if(p == 0) // оговоренное постусловие


throw ("FREE STORE EXHAUSTED"); // устанавливается исключение для старых компиляторов
}
int& vect::element(int n)
{ if(n < 0 || n > size-1)
throw ("ILLEGAL NUMBER OF ELEMENT");
// устанавливается исключение
return (p[n]);
}

Тапсырма
Екі бүтін санды көбейту функциясын сипаттаңыз, жоғарыдан асып кету қатесін өңдеңіз.

Код:


#include
template
bool checkMultyplyOverflow(I lArg, I rArg){
enum {
bitsPerByte = 8,
correction = static_cast(-1) > 0 ? 0 : 1, //для знаковых на один бит меньще, потому что он нужен для знака
bound = sizeof(I) * bitsPerByte - correction
};
std::size_t msb = 0; //(most significant bit) старший бит
I one = 1;
for (int i = bound - 1; i >= 0; --i)
if(lArg & (one << i)){
msb = i;
break;
}
for (int i = bound - 1; i >= 0; --i)
if(rArg & (one << i)){
if(i + msb >= bound)
return true;
break;
}
return false;
}
int main(){
unsigned char ulArg = 2;
unsigned char urArg = 127;
std::cout<ulArg = 32;
urArg = 6;
std::cout<char slArg = 127;
char srArg = 2;
std::cout<return 0;
}

Template – шаблон


Bool – Логический тип
Enum – перечисляются целые константы
Bound – иретаор(указатель сиякты)


Достарыңызбен бөлісу:




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет