2010-03-05 86 views
5

我有一個情況,我希望在std :: vector中存儲資源列表。在我看來,我的選擇是如下:RAII和C++ STL

  1. 給我的資源默認的構造函數
  2. 並將其作爲堆對象(和它們包裝在一個共享的指針)

選擇1使它可能構建無效資源,選項2迫使我使用堆。

我是否缺少此處的選項?

+1

你爲什麼要給資源默認ctor?矢量只需要複製ctor。 – Naveen 2010-03-05 07:28:50

+2

「選項2強制我使用堆」 - 嗯,該矢量也將它的東西存儲在堆上(除非使用自定義分配器),儘管在連續內存中。所以你將無法以這種或那種方式繞過堆。 – 2010-03-05 07:47:29

+0

發現我在我的資源中存儲了一個引用,所以問題不是默認的構造函數,thx – dirk 2010-03-05 07:55:56

回答

7

您不需要默認構造函數就可以獲得實例的向量。

唯一的限制是,當類沒有默認構造函數時,不能使用vector :: resize與默認參數。

vec.resize(20); // requires default constructor 

,但你可以給矢量::調整爲默認對象:

std::vector<foo> vec; 
vec.resize(20, foo(10)); // give a sample object since foo has not default constructor 
1

您可以存儲在矢量不平凡constuctor對象。 stl容器中存儲的對象應該具有賦值語義(複製構造函數和賦值運算符)。

1

第三種選擇是使用Boost.PointerContainer。但是,您的對象仍將單獨分配到堆上。正如約翰所評論的,std :: vector已經使用堆來存儲對象(連續),所以沒有辦法完全避免堆。

允許資源(如互斥鎖,I/O流等)具有複製語義通常沒有意義。所以它們必須通過使複製構造函數和賦值運算符爲私有而呈現爲不可複製的。不幸的是,不可複製的限制使得不可能將資源直接存儲爲STL容器中的值。因此必須求助於Boost.PointerContainer或智能指針的容器。 動機 Boost.PointerContainer文檔的一部分解釋了爲什麼你更喜歡使用另一種。