2013-02-18 59 views
-1

我能夠創建整數像這樣的動態大小的數組:動態分配對象的數組失敗

int *cacheL2 = new int[L2/B2]; 

,我還能夠創建Data類型的對象是這樣的:

Data one(12,12); 

,現在我想的Data動態大小的數組:

Data * vlaObj = new Data[L2/B2]; 

但它不起作用...

此外,如果你能告訴我如何獲得散列工作的c + +將是偉大的。我正在尋找示例,但是所有內容都只是說#include「hash_map」,但是當我嘗試使用該庫時,似乎找不到它們中的任何一個。

+3

它如何「不起作用」? – juanchopanza 2013-02-18 00:47:01

+0

我懷疑你的類沒有默認的構造函數?哦,至於散列圖,如果你可以使用C++ 11,可以使用std :: unordered_map。 – Corbin 2013-02-18 00:47:19

+2

有沒有理由不能使用STL? – Aesthete 2013-02-18 00:47:46

回答

2
#include <vector> 

// ... 
std::vector<Data> v; 
v.emplace_back(12, 12); 
+2

值得注意的是'emplace_back'是C++ 11的一個特性。 C++ 03替換可以是'v.push_back(Data(12,12));'。 – LihO 2013-02-18 00:58:13

1

這裏沒有理由不使用STL容器。建議使用std::vector而不是原始指針:

#include <vector> 

//... 
std::vector<Data> vlaObj(L2/B2); 
vlaObj.push_back(one) 

編輯:BTW是有任何機會,L2,甚至B2值可以是0

+1

我懷疑,如果OP的例子「沒有工作」,這一個也不會工作。 – juanchopanza 2013-02-18 00:54:35

0

其中最可能的原因Data* arr = new Data[len];是行不通的,因爲類型Data沒有默認構造函數,即Data::Data()

但無論Data是否有默認的構造函數,不管怎麼說,嘗試創建一個這樣的數組並不是一個好主意。一旦你用new[]動態分配它,你承諾自己照顧醜陋的內存管理連接它。使用其中一個STL容器(如std::vector#include <vector>必需))將爲您處理內存管理更好。

這時你有幾種選擇:

std::vector<Data> v;     // option 1 
v.reserve(len); 
// in loop: 
    v.push_back(Data(x, y));   // there could be different values 

std::vector<Data> v2(len);    // option 2 

std::vector<Data> v3(len, Data(12,12)); // option 3 

第一種選擇將適合幾乎任何情況。它準備的內存塊大到足以容納len元素,然後您可以方便但仍然非常有效的方式填寫v。選項2要求Data具有默認構造函數,該選項由使用自定義構造函數構造元素的選項3解決。

所有提到的選項都會導致std::vector對象創建自動存儲持續時間。請注意,所有元素都存儲在一個連續的內存塊中,因此您可以使用&v[0]來初始化指向其第一個元素的指針,並以與您使用動態分配數組相同的方式使用它。