看《C++Primer》看到了第18章,这章新讲解了allocator用于分配内存并初始化。打算练练手,于是把之前写好的模拟STL的vector模板做了下修改,用allocator类来管理内存。但只替换了new的部分,delete部分嫌麻烦,暂且不替换。
下面是出错的源程序:
#include <string>
#include <iostream>
#include <allocators>
using namespace std;
#ifndef VectorH
#define VectorH
namespace ls{
template<class T>
class Vector
{
public:
// myIterator;
typedef T* myIterator ;
Vector();
void push_back(T &data);
T& operator[](int index);
int Size();
int Capacity();
myIterator begin() {return head;}
myIterator end(){return alloc;}
private:
int size; //实际已经使用的元素的个数
int capacity; //容器可以存储的元素的个数
T* head, //数组头指针
*alloc; //当前第一个可分配的指针
allocator<T> allocat;
};
template<class T>
Vector<T>::Vector()
{
capacity = 5;
//head = new T[capacity];
//开辟capacity个对象的空间,但不负责初始化
head = allocat.allocate(capacity);
alloc = head;
}
template<class T>
void Vector<T>::push_back(T &data)
{
//空间不够则扩容
if(alloc == head + capacity)
{
int newCapacity = capacity + 10;
//T *newHead = new T[newCapacity];
T *newHead = allocat.allocate(newCapacity);
//for(int i=0; i<capacity; i++) *(newHead + i) = *(head + i);
uninitialized_copy(head, head + capacity, newHead);
delete[] head; //释放旧空间的内容
//混搭使用造成出错
/*
必须这样释放内存才可!
for(int i=0; i<capacity; ++i)
allocat.destroy(head + i);
allocat.deallocate(head, capacity);
*/
head = newHead;
alloc = newHead + capacity;
capacity = newCapacity;
}
//*alloc = data;
allocat.construct(alloc, data);
alloc ++;
}
template<class T>
T& Vector<T>::operator[](int index)
{
if(index < Size()) return *(head + index);
else cout << "error";
}
template<class T>
int Vector<T>::Size()
{
return alloc - head;
}
template<class T>
int Vector<T>::Capacity()
{
return capacity;
}
/*
为什么不能放在类体外定义?
template<class T>
Vector<T>::myIterator Vector<T>::begin()
{
return head;
}
template<class T>
Vector<T>::myIterator Vector<T>::end()
{
return alloc;
}*/
}//end namespace
#endif
《C++primer》也并没有讲解没什么不能混搭,我自己猜测错误原因是这个样子,于是把delete部分改成了allocator的撤销风格操作。得以正常运行,没有运行时错误了。