2014-01-23 46 views
6

考慮下面的代碼:我應該假設一個對象的析構函數在從STL容器中移除後立即被調用?

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

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

    ... 
} 

v.pop_back()後,請問STL保證T::~T()已呼籲v.back()?注意:任何刪除元素的向量的任何方法(例如resize()erase()等)的問題都適用。

我正在爲我的應用程序編寫容器類,我希望它們儘可能地遵守原則由標準庫使用。如果我的集裝箱班不做這個保證,是否有風險?

+6

簡短回答:是的 – AndyG

+0

你是什麼意思的「立即」?你打算根本不打電話給析構函數,還是打算安排稍後調用它(當有人調用'push_back',或者銷燬你的容器時)?無論哪種方式,你的東西不會表現爲一個容器,但它可以離期望的更近或更遠...... –

+0

我想知道你在想什麼其他操作會導致它 – PlasmaHH

回答

2
std::vector::erase 

從矢量容器中移除並在元素上調用析構函數。這同樣適用於std::vector::pop_back

void pop_back() { 
    --this->_M_impl._M_finish; 
    this->_M_impl.destroy(this->_M_impl._M_finish); 
     } 

和破壞是分配的方法:

void destroy(pointer __p) { __p->~_Tp(); } 
           ^^^ 
          dereference and call destructor 
          on new_allocator::value_type 
對我實施分配

vector這是模板參數Alloc = std::allocator<_Tp>初始化它的基礎__glibcxx_base_allocator蒙山new_allocator由於這樣的定義:

#define __glibcxx_base_allocator __gnu_cxx::new_allocator 

allocator(const allocator& __a) throw() 
     : __glibcxx_base_allocator<_Tp>(__a) { } 
+2

這只是'vector :: pop_back()'的一個實現 – MarkB

2

C++ 11§23.2.3描述了序列容器的要求。

pop_back()的條目表示它「銷燬最後一個元素」。

我想你可以爭辯說,它沒有明確地說。雖然,我懷疑這意味着暗示。

需要注意的另一個要求是§23.2.1。它說的是一個容器的析構函數

注:析構函數應用於a;所有的內存 被解除分配。

所以我想你可以推遲銷燬已移除的元素,只要它們在容器被銷燬前銷燬。如果你真的試圖遵循標準的原則,我可以自信地說標準作者會期望一個被移除的元素被立即銷燬。

相關問題