#include<iostream>
using namespace std;
template <typename T>
class Vector {
public:
Vector<T>(int size = 10) {
_first = new T[size];
_last = _first;
_end = _first + size;
}
~Vector<T>() {
delete[]_first;
_last = _end = nullptr;
}
Vector<T>(const Vector<T>& rhs) {
int size = rhs._end - rhs._first;
_first = new T[size];
int len = rhs._last - rhs._first;
for (int i = 0; i < len; ++i) {
_first[i] = rhs._first[i];
}
_last = _first + len;
_end = _first + size;
}
Vector<T>& operator=(const Vector<T>& rhs) {
if (this == &rhs)
return *this;
delete[]_first;
int size = rhs._end - rhs._first;
_first = new T[size];
int len = rhs._last - rhs._first;
for (int i = 0; i < len; ++i) {
_first[i] = rhs._first[i];
}
_last = _first + len;
_end = _first + size;
return *this;
}
void push_back(const T& val) {
if (full())
expand();
*_last++ = val;
}
void pop_back() {
if (empty())
return;
--_last;
}
T back()const {
return *(_last - 1);
}
bool full()const {
return _last == _end;
}
bool empty()const {
return _first == _last;
}
int size()const {
return _last - _first;
}
private:
T* _first;
T* _last;
T* _end;
void expand() {
int size = _end - _first;
T* ptmp = new T[size * 2];
for (int i = 0; i < size; ++i) {
ptmp[i] = _first[i];
}
delete[]_first;
_first = ptmp;
_last = _first + size;
_end = _first + size * 2;
}
};
class Test {
public:
Test() {
cout << "Test()" << endl;
}
~Test() {
cout << "~Test()" << endl;
}
};
int main() {
Vector<Test> vec1;//会生成10个构造函数和析构函数,new开辟空间的同时调用构造
return 0;
}
现在是在开辟的数组上每一位都生成一个对象,push_back的时候再拷贝构造。pop_back的时候直接抛弃对象,没有释放该对象上申请的堆内存,下次再push_back该块内存申请的堆内存就再也无法释放了
需求:构造时需要将内存开辟和对象构造分开处理,析构时析构有效空间,再释放所有堆内存,而不是全部构造全部析构所以不能用new和delete
pop_back时需要先析构对象
allocator
做四件事:内存开辟/内存释放,对象构造/对象析构
#include<iostream>
using namespace std;
template<typename T>
class Allocator {
public:
T* allocate(size_t size) {//负责开辟内存
return (T*)malloc(sizeof(T) * size);
}
void deallocate(void* p) {//负责释放内存
free(p);
}
void construct(T* p, const T& val) {//负责对象构造
new(p)T(val);//定位new,在*p拷贝构造val
}
void destroy(T* p) {//负责对象析构
p->~T();//T是类名,直接调用它的析构函数
}
};
template<typename T, typename Alloc = Allocator<T>>
class Vector {
public:
Vector<T,Alloc>(size_t size = 10) {
//_first = new T[size];
_first = _allocator.allocate(size);
_last = _first;
_end = _first + size;
}
~Vector<T, Alloc>() {
//delete[]_first;
for (T* p = _first; p != _last; ++p) {//析构有效内存
_allocator.destroy(p);
}
_allocator.deallocate(_first);
_first = _last = _end = nullptr;
}
Vector<T, Alloc>(const Vector<T>& rhs) {
int size = rhs._end - rhs._first;
//_first = new T[size];
_first = _allocator.allocate(size);
int len = rhs._last - rhs._first;
for (int i = 0; i < len; ++i) {
//_first[i] = rhs._first[i];
_allocator.construct(_first + i,rhs._first[i]);
}
_last = _first + len;
_end = _first + size;
}
Vector<T, Alloc>& operator=(const Vector<T>& rhs) {
if (this == &rhs)
return *this;
//delete[]_first;
for (T* p = _first; p != _last; ++p) {//析构有效内存
_allocator.destroy(p);
}
_allocator.deallocate(_first);
int size = rhs._end - rhs._first;
//_first = new T[size];
_first = _allocator.allocate(size);
int len = rhs._last - rhs._first;
for (int i = 0; i < len; ++i) {
//_first[i] = rhs._first[i];
_allocator.construct(_first + i, rhs._first[i]);
}
_last = _first + len;
_end = _first + size;
return *this;
}
void push_back(const T& val) {
if (full())
expand();
//*_last++ = val;
_allocator.construct(_last, val);
_last++;
}
void pop_back() {
if (empty())
return;
//--_last;
--_last;
_allocator.destroy(_last);
}
T back()const {
return *(_last - 1);
}
bool full()const {
return _last == _end;
}
bool empty()const {
return _first == _last;
}
int size()const {
return _last - _first;
}
private:
T* _first;
T* _last;
T* _end;
Alloc _allocator;
void expand() {
int size = _end - _first;
//T* ptmp = new T[size * 2];
T* ptmp = _allocator.allocate(size * 2);
for (int i = 0; i < size; ++i) {
//ptmp[i]=_first[i];
_allocator.construct(ptmp + i, _first[i]);
}
//delete[]_first;
for (T* p = _first; p != _last; ++p) {
_allocator.destroy(p);
}
_allocator.deallocate(_first);
_first = ptmp;
_last = _first + size;
_end = _first + size * 2;
}
};
class Test {
public:
Test() {
cout << "Test()" << endl;
}
~Test() {
cout << "~Test()" << endl;
}
Test(const Test& test) {
cout << "Test(const Test& test)" << endl;
}
};
int main() {
//Vector<Test> vec1;//会生成10个构造函数和析构函数,new开辟空间的同时调用构造
Test t1, t2, t3;
Vector<Test> vec1;
vec1.push_back(t1);
vec1.push_back(t2);
vec1.push_back(t3);
vec1.pop_back();
return 0;
}