2013-01-11 102 views
1

我正在構建一個結構,其中一個成員是一個地圖。
第一個問題是允許的嗎?編譯器沒有抱怨。使用stl map作爲struct的成員

struct A { 
    map<int, float> B; 
} 

後來我聲明瞭這樣的數據類型的數組。

A *C = (A *)INTERNAL_CALLOC(..., sizeof(A)); 

這裏功能INTERNAL_CALLOC是MALLOC的功能包裝。
稍後在代碼中,當我嘗試第一次插入一個項目到數組的第一個元素的映射時,我得到了一個核心轉儲。

C[0].B[0] = 0.001; 

任何想法爲什麼是這種情況?
謝謝!

+0

代碼部分沒有出來的權利。結構A之後的行是「map B」; – elgnoh

+3

你不應該使用'malloc'來分配C++對象(你的結構是)。你應該使用'new'。 –

回答

5

是的,結構中的地圖很好。

分配malloc肯定是不是好;該構造函數不被調用。所以當你嘗試使用它時,你的地圖很可能會做一些糟糕的事情。

一般經驗法則:不要在C++中使用malloc/calloc/realloc/free。儘可能避免動態分配,並在不可避免時使用new/delete*


*而就智能指針閱讀起來。

+0

我該怎麼做才能確保構造函數被調用?謝謝。 – elgnoh

+0

@elgnoh:查看更新的答案。 –

+0

會給新的/刪除一個嘗試。謝謝 – elgnoh

0

使用malloc分配內存不會初始化數組元素。

+0

它根本不初始化地圖*,與元素無關。 –

+0

@Ed數組元素是A類的。數組元素是類A的成員,所以如果數組元素沒有初始化(就像我說過的),那麼映射也不會被初始化(就像你說的那樣)。如果數組元素已初始化(如使用operator new []時所用的那樣),那麼映射也將被初始化(因爲這就是C++的工作原理)。所以它恰好與數組元素沒有被初始化,沒有別的。 – Oswald

+0

對不起,我以爲你說數組的時候是指地圖。我的錯誤,我不應該假設。 –

0

通過填充零字節的內存不會得到有效的std::map<whatever...>

在某種程度上,POD類型(近似於「純C」數據結構)是可能的。

1
A *C = (A *)INTERNAL_CALLOC(..., sizeof(A)); 

在這裏,你說謊的編譯器。您告訴它INTERNAL_CALLOC的返回值指向A,但它不是,它只是指向零。使用new

+0

你的話很強,但我喜歡你的解釋:) – elgnoh

2

如果您確實必須使用INTERNAL_CALLOC進行分配,請使用新的展示位置。

首先,你必須定義爲A類構造函數和析構函數,或定義爲一類:

struct A { 
    A(){} 
    ~A(){} 
    map<int, float> B; 
}; 

然後,您只需撥打:

//Allocate an A, uninitialized 
A *C = (A *)INTERNAL_CALLOC(..., sizeof(A)); 
//Initialize the newly allocated A 
new (C) A(); 

後,當你自由對象必須顯式調用析構函數:

//A *C; 
C->~A(); 
INTERNAL_free(C); 
+0

試過這種方法,但得到了同樣的錯誤。現在我正在切換到使用new來分配數組。 – elgnoh

0

由於您使用std::map作爲一個成員, 我建議使用std::vector而不是普通數組來作爲容器。

您可以如下操作:

struct A 
{ 
    std::map<int, int> B; 
}; 

std::vector<A> vecofmap;  

A elem0; 
A elem1; 
A elem2; 

vecofmap.push_back(elem0); 
vecofmap.push_back(elem1); 
vecofmap.push_back(elem2); 

vecofmap[0].B[0] = 100; 

std::cout << vecofmap[0].B[0] <<std::endl; 

然後沒有需要內存分配打擾。

相關問題