2016-11-29 101 views
2

我想了解std :: vector,並且我知道如果vector是一個包含用戶定義的類的向量,那麼調用它的析構函數以防萬一類擁有資源的「所有權」。在這種情況下,我想它會遍歷每個元素並在每個元素上調用析構函數。std :: vector對於清除或刪除POD有不同的作用

但是在普通的舊數據的情況下,我不認爲需要調用析構函數,只是簡單地刪除整個塊。如果我不得不猜測,我會說,這將是更快的說,重新分配。

實現你自己的數組類會相當容易地區分這兩者,並根據需要做什麼而有所不同?謝謝。

+3

「清楚」是什麼意思?何時或爲何矢量需要「清除」其數據?你能否展示一些代碼來說明你的問題和你遇到的問題?最重要的是,這只是好奇心還是你想解決的實際問題?那麼*實際*問題是什麼? –

+0

沒有'std :: is_pod'就不容易區分。標準庫實施者不需要執行此檢查。但如果受歡迎的人不這樣做,我會感到驚訝。 – StoryTeller

+1

如果我正確地解決了你的問題,你會問:「我可以只用std :: vector memset清除或初始化POD?」。這不是非常C++的 - 做事的方式,因爲如果你以後添加一個會將你的類型變成非pod的成員,你可能會破壞事情。 –

回答

1

從GCC向量執行:

void 
clear() 
{ _M_erase_at_end(this->_M_impl._M_start); } 

所以,清晰的通話保護功能_M_erase_at_end,讓,看看吧:

void 
_M_erase_at_end(pointer __pos) 
{ 
    std::_Destroy(__pos, this->_M_impl._M_finish, _M_get_Tp_allocator()); 
    this->_M_impl._M_finish = __pos; 
} 

而且它調用的std :: _從載體開始銷燬(__pos開始)直到結束。

template<typename _ForwardIterator, typename _Allocator> 
void 
_Destroy(_ForwardIterator __first, _ForwardIterator __last, 
    _Allocator& __alloc) 
{ 
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits; 
for (; __first != __last; ++__first) 
__traits::destroy(__alloc, std::__addressof(*__first)); 
} 

所以,它的迭代遍及內部數組並調用__traits ::破壞,不釋放所有的內存塊一次。

編輯:你寫了But it would seem when clearing vector that it does call delete on its elements - 答案很大NO。 STL容器不是OWN外部分配的內存,您始終必須調用delete或使用shared \ unique_ptr或它將會泄漏。

+0

我知道指針向量不會釋放指針指向的內存。然後不向量區分指向類型和類型的指針?它似乎調用刪除矢量的每個元素,但不是矢量,這將是一個泄漏,我認爲。 – Zebrafish

相關問題