Найдите ошибку в «неряшливой» версии конструктора vector (параграф E.3.1) и напишите программу, приводящую этот конструктор к краху. Подсказка: сначала реализуйте деструктор для типа vector.
Ну от написал прогу определил деструктор, я в деструкторе просто показал что он не вызвался, потому что крах в конструкторе, но память выделилась. Это просто наглядный пример того что у нас не безопасный код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#include <iostream> using std::cout; using std::endl; #include <allocators> using std::allocator; class bad{}; template<class T,class A=allocator<T> > class vector { private: T* v;//начало выделенной памяти T* space;//конец последовательности элементов (начало св-го пространства) T* last;//конец выделенной памяти A alloc;//аллокатор public: typedef int size_type; explicit vector(size_type n,const T& val=int(),const A& a=A()); vector(const vector& a);//копирующий конструктор vector& operator=(const vector& a);//присваивание ~vector(); size_type size()const {return space-v;} size_type capacity()const {return last-v;} void push_back(const T&); }; template<class T,class A> vector<T,A>::vector(size_type n, const T& val, const A& a) :alloc(a)//копируем аллокатор { v=alloc.allocate(n);//выделяем память под элементы space=last=v+n; int count(0); for(T* p=v;p!=last;++p) { count++; cout <<"count= "<<count<<endl; if(count==2) throw bad(); alloc.construct(p,val);//создаем копию val в *P } } template<class T, class A> vector<T,A>::~vector(){cout <<"dectr classa vector"<<endl;} int main() { try { vector<int> v(4); /* int* p; const int& i=int(); allocator<int> a; p=a.allocate(1); a.construct(p,i); cout <<*p<<endl;*/ } catch(bad&) { cout <<"crabotalo except bad"<<endl; } return 0; } |
[youtube]https://www.youtube.com/watch?v=dA3RO0qM9M0[/youtube]