在实现std :: vector时,我是否必须拥有end()的"end"指针?

blu*_*gon 2 c++ memory memory-management stdvector

假设我有自己的实现std::vector,它为迭代提供begin()end()函数.可能会发生size()== capacity()和返回的指针end()不归我所有.它是安全的还是我需要确保size()< capacity()

我知道这一难题可以通过使用自定义的迭代器类来克服,但在这里,我说的是,当简单的情况下,begin()简单地返回一个指向缓冲区的开始,并end()begin()+size().

Dav*_*aim 5

该标准禁止解除引用无效指针(标准的长度很长,描述了可能使指针无效的内容,例如指针的生命周期,内存块本身的生命周期以及指针的对齐).

只要该指针的用户没有取消引用它,就可以保持无效指针,并且在某些情况下只要该指针的用户不读取它(参见注释部分).

正如你自己建议的那样,end很简单return begin() + size()

  • 根据[this](/sf/answers/3092805691/),它是C++ 14及更高版本中的实现定义行为,以及C++ 11中的UB. (2认同)
  • @DavidHaim在`delete`之后使用指针并与过去比较结束指针是不同的事情.它们都不是可解除引用的,但是过去然后结束指针可以与删除的指针不能进行比较. (2认同)