// Base class for ordinary allocators.
template <class _Tp, class _Allocator, bool _IsStatic>
class _Vector_alloc_base {
public:
typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type
allocator_type;
allocator_type get_allocator() const { return _M_data_allocator; }
_Vector_alloc_base(const allocator_type& __a)
: _M_data_allocator(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0)
{}
protected:
allocator_type _M_data_allocator;
_Tp* _M_start;
_Tp* _M_finish;
_Tp* _M_end_of_storage;
_Tp* _M_allocate(size_t __n)
{ return _M_data_allocator.allocate(__n); }
void _M_deallocate(_Tp* __p, size_t __n)
{ if (__p) _M_data_allocator.deallocate(__p, __n); }
};
// Specialization for allocators that have the property that we don't
// actually have to store an allocator object.
template <class _Tp, class _Allocator>
class _Vector_alloc_base<_Tp, _Allocator, true> {
public:
typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type
allocator_type;
allocator_type get_allocator() const { return allocator_type(); }
_Vector_alloc_base(const allocator_type&)
: _M_start(0), _M_finish(0), _M_end_of_storage(0)
{}
protected:
_Tp* _M_start;
_Tp* _M_finish;
_Tp* _M_end_of_storage;
typedef typename _Alloc_traits<_Tp, _Allocator>::_Alloc_type _Alloc_type;
_Tp* _M_allocate(size_t __n)
{ return _Alloc_type::allocate(__n); }
void _M_deallocate(_Tp* __p, size_t __n)
{ _Alloc_type::deallocate(__p, __n);}
};
这里class _Vector_alloc_base为什么被定义了两次?
还有就是第二次定义class _Vector_alloc_base<_Tp, _Allocator, true>时,class+类名+<>的写法是什么意思?
你可以这么理解,当第一次push_back的时候用了默认的。而第二次push_back的时候,发现vector默认的内存不够了,于是push_back重新删掉以前的内存
(vector的特性是数组,所以要保持内存连续,如果有新增的内存,那么每次新增必须删掉以前的内存,再重新new出新的能容纳新增的内存)。
所以会出现你这个情况,第一次push_back内存够了。第二次push_back内存不够,删掉以前的t1内存(发生t1的析构)。然后再创建一个能容纳ti t2的新内存
。
上面是解释你push_back。
而delete vec_Teacher;这句会把所有的内存删掉(就是t1 t2 都析构掉)
以上就是解释为什么,会出现俩次t1的析构和一次t2的析构。
自己搞定了,模板特化问题
当第一次push_back的时候用了默认的。而第二次push_back的时候,发现vector默认的内存不够了,于是push_back重新删掉以前的内存
push_back的时候用了默认的。而第二次push_back的时候,发现vector默认的内存不够了,于是push_back重新删掉
第一次默认,第二次发现默认的不够用或者达不到要求,所以重新定义