zl363540956
zl363540956
采纳率0%
2018-06-24 02:13 阅读 670

读C++ STL源码时遇见的一个问题,同样的类为什么定义两次?

10
 // 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+类名+<>的写法是什么意思?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

5条回答 默认 最新

  • qq_39161890 張怼怼 2018-06-24 02:16

    你可以这么理解,当第一次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的析构。

    点赞 评论 复制链接分享
  • zl363540956 zl363540956 2018-06-24 03:42

    自己搞定了,模板特化问题

    点赞 评论 复制链接分享
  • weixin_35379726 weixin_35379726 2018-06-24 04:06

    当第一次push_back的时候用了默认的。而第二次push_back的时候,发现vector默认的内存不够了,于是push_back重新删掉以前的内存

    点赞 评论 复制链接分享
  • wangping623 我能想到的 2018-06-24 10:31

    push_back的时候用了默认的。而第二次push_back的时候,发现vector默认的内存不够了,于是push_back重新删掉

    点赞 评论 复制链接分享
  • qq_31126283 qq_31126283 2018-07-15 03:07

    第一次默认,第二次发现默认的不够用或者达不到要求,所以重新定义

    点赞 评论 复制链接分享

相关推荐