我是否应该假设从STL容器中删除后立即调用对象的析构函数?

Mar*_*rkB 6 c++ destructor stl vector

请考虑以下代码:

class T { ... }; // T has a non-trivial destructor

void foo() {
    std::vector<T> v( 5 );
    v.pop_back();

    ...
}
Run Code Online (Sandbox Code Playgroud)

之后v.pop_back(),STL是否保证T::~T()已被要求v.back()?注意:问题保持用于去除元件载体的任何方法(例如resize(),erase()等...)

我正在为我的应用程序编写容器类,我希望它们尽可能符合标准库使用的原则.如果我的集装箱舱没有做出这种保证,是否有任何风险?

4pi*_*ie0 2

std::vector::erase
Run Code Online (Sandbox Code Playgroud)

从向量容器中删除并调用元素的析构函数。这同样适用于std::vector::pop_back.

void pop_back() {
    --this->_M_impl._M_finish;
    this->_M_impl.destroy(this->_M_impl._M_finish);
      }
Run Code Online (Sandbox Code Playgroud)

destroy 是分配器的一种方法:

void destroy(pointer __p) { __p->~_Tp(); }
                              ^^^
                            dereference and call destructor
                            on new_allocator::value_type
Run Code Online (Sandbox Code Playgroud)

在我的实现分配器上,vector模板参数Alloc = std::allocator<_Tp>初始化了它的基础__glibcxx_base_allocatorwhith new_allocator,因为这个定义:

 #define __glibcxx_base_allocator  __gnu_cxx::new_allocator 

allocator(const allocator& __a) throw()
      : __glibcxx_base_allocator<_Tp>(__a) { }
Run Code Online (Sandbox Code Playgroud)

  • 这只是 `vector::pop_back()` 的一种实现 (2认同)