[英]Why does vector::push_back and emplace_back call value_type::constructor twice?
[英]Why does an empty vector call the value type's default constructor?
使用g ++,我觀察到創建一個大小為零的向量會調用向量的參數化對象類型的構造函數一次。 然后它被刪除。 為什么會這樣?
#include <iostream>
#include <vector>
using namespace std;
class s
{
public:
s() { cout << endl << "default s constructor" << endl; }
~s() { cout << endl << "default s destructor" << endl; }
};
int main()
{
vector<s> v(0);
}
輸出:
默認的構造函數
默認的析構函數
因為您顯式傳遞初始大小,該大小調用具有另一個參數(默認值為s()
的構造函數。 只要省略(0)
(即std::vector<s> v;
)就不會發生。
為了完整起見,標准23.2.4-2將您調用的構造函數定義為:
explicit vector(size_type n, const T& value =
T()
,
const Allocator& = Allocator());
旁白(與C ++ 03相關但不與C ++ 11相關)
這個構造函數的另一個有趣的行為方面也定期提出SO:當請求的元素的初始數量> 0時,它將這些元素從原型參數復制構造到構造函數:
vector(n)
幾乎與底層的免費存儲分配一樣快,但是 這具有明顯的性能成本,但是如果垃圾內容包括例如復制構造器只能假設有效的指針,則也可能使應用程序崩潰。 類似地,即使push_back
這樣一個未初始化的垃圾對象也是非常危險的 - 它缺乏適當的值語義封裝,並且可能在向量調整大小時被復制,像向量等執行算法操作,例如std::sort()
。
您正在調用的實際構造函數是(來自cplusplus.com):
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
因此,即使您只指定了大小,也會為第二個參數創建一個新的T
對象,因此也會在構造函數結束時銷毀它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.