(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 – иретаор(указатель сиякты)
Достарыңызбен бөлісу: