[英]use stl map as member of struct
我正在構建一個結構,其中一個成員是地圖。
第一個問題,這允許嗎? 編譯器沒有抱怨。
struct A {
map<int, float> B;
}
后來我聲明了一個這種數據類型的數組。
A *C = (A *)INTERNAL_CALLOC(..., sizeof(A));
這里的INTERNAL_CALLOC
函數是 MALLOC 的功能包裝器。
稍后在代碼中,當我第一次嘗試將一個項目插入數組的第一個元素的映射時,我得到了一個核心轉儲。
C[0].B[0] = 0.001;
知道為什么會這樣嗎?
謝謝!
是的,結構中的地圖很好。
用malloc
分配肯定不行; 不調用構造函數。 因此,當您嘗試使用地圖時,您的地圖很可能會做一些可怕的事情。
一般經驗法則:不要在 C++ 中使用malloc
/ calloc
/ realloc
/ free
。 盡可能避免動態分配,並在不可避免時使用new
/ delete
。 *
如果您確實必須使用 INTERNAL_CALLOC 進行分配,則使用新的放置位置。
首先,您必須為類型 A 定義一個構造函數和一個析構函數,或者將 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);
A *C = (A *)INTERNAL_CALLOC(..., sizeof(A));
在這里,您向編譯器撒謊。 你告訴它INTERNAL_CALLOC
的返回值指向A
,但它沒有,它只是指向零。 使用new
。
使用 malloc 分配內存不會初始化數組元素。
通過用零字節填充內存,您不會獲得有效的std::map<whatever...>
。
在某種程度上,POD 類型(大約為“純 C”數據結構)是可能的。
由於您使用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;
這樣就無需費心分配內存了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.