簡體   English   中英

使用 stl map 作為 struct 的成員

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM