C++ 使用stl映射作为结构的成员

C++ 使用stl映射作为结构的成员,c++,stl,map,C++,Stl,Map,我正在构造一个结构,其中一个成员是映射。 第一个问题,这是允许的吗?编译器没有抱怨 struct A { map<int, float> B; } 这里的函数INTERNAL\u CALLOC是MALLOC的函数包装器。 稍后在代码中,当我第一次尝试将项目插入数组的第一个元素的映射时,我得到了一个核心转储 C[0].B[0] = 0.001; 知道为什么会这样吗? 谢谢 使用malloc分配内存不会初始化数组元素 使用malloc分配内存不会初始化数组元素 是

我正在构造一个结构,其中一个成员是映射。
第一个问题,这是允许的吗?编译器没有抱怨

struct A {  
  map<int, float> B;  
}  
这里的函数
INTERNAL\u CALLOC
是MALLOC的函数包装器。
稍后在代码中,当我第一次尝试将项目插入数组的第一个元素的映射时,我得到了一个核心转储

C[0].B[0] = 0.001;  
知道为什么会这样吗?

谢谢

使用malloc分配内存不会初始化数组元素

使用malloc分配内存不会初始化数组元素

是的,结构中的映射很好

使用
malloc
进行分配肯定是好的;未调用构造函数。所以当你试图使用地图时,它很可能会做一些可怕的事情

一般经验法则:不要在C++中使用<代码> Malc < /Calp>/<代码> CaloC< /Calp>/<代码>尽可能避免动态分配,并在不可避免时使用

new
/
delete
*



*阅读智能指针。

是的,结构中的映射很好

使用
malloc
进行分配肯定是好的;未调用构造函数。所以当你试图使用地图时,它很可能会做一些可怕的事情

一般经验法则:不要在C++中使用<代码> Malc < /Calp>/<代码> CaloC< /Calp>/<代码>尽可能避免动态分配,并在不可避免时使用

new
/
delete
*



*并读取智能指针。

如果用零字节填充内存,则无法获得有效的
std::map


在某种程度上,POD类型(大约为“纯C”数据结构)是可能的。

如果用零字节填充内存,则无法获得有效的
std::map

在某种程度上,POD类型是可能的(大约是“纯C”数据结构)

在这里,你在对编译器撒谎。您告诉它,来自
INTERNAL_CALLOC
的返回值指向
A
,但它没有,它只是指向零。使用
new


在这里,你在对编译器撒谎。您告诉它,来自
INTERNAL_CALLOC
的返回值指向
A
,但它没有,它只是指向零。使用
new

如果您确实必须使用INTERNAL\u CALLOC进行分配,则使用placement new

首先,必须为类型a定义构造函数和析构函数,或将a定义为类:

struct A {
  A(){}
  ~A(){}
  map<int, float> B;  
};
稍后释放对象时,必须显式调用析构函数:

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

如果您确实必须使用INTERNAL_CALLOC进行分配,则使用placement new

首先,必须为类型a定义构造函数和析构函数,或将a定义为类:

struct A {
  A(){}
  ~A(){}
  map<int, float> B;  
};
稍后释放对象时,必须显式调用析构函数:

//A *C;
C->~A();
INTERNAL_free(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;
结构A { 地图B; }; 向量向量映射; A元素0; A elem1; A elem2; 向量映射推回(elem0); 向量映射推回(elem1); 向量映射推回(elem2); vecofmap[0].B[0]=100;
std::cout因为您使用
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;
结构A { 地图B; }; 向量向量映射; A元素0; A elem1; A elem2; 向量映射推回(elem0); 向量映射推回(elem1); 向量映射推回(elem2); vecofmap[0].B[0]=100;

std::cout代码部分出现错误。在结构A为“map B”之后,您不应该使用 MalOC 分配C++对象(您的结构是什么)。您应该使用
new
。代码部分没有正确显示。在结构A为“map B”之后,您不应该使用 MalOC 分配C++对象(您的结构是什么)。您应该使用
new
。我应该如何确保调用构造函数?谢谢。将尝试新建/删除。谢谢我该怎么做才能确保调用构造函数?谢谢。将尝试新建/删除。ThanksIt根本不初始化映射,与元素无关。@Ed数组元素属于类A。映射是类A的成员,因此如果数组元素没有初始化(如我所说),映射也不会初始化(如你所说)。如果数组元素被初始化(就像使用new new)一样,映射也会被初始化(因为C++是这样工作的)。所以这完全和数组元素没有被初始化有关,其他什么都没有。对不起,我以为你说数组的时候是指映射。我的错误,我不应该假设。它根本不会初始化映射,与元素无关。@Ed数组元素属于A类。映射是A类的成员,因此如果数组元素没有初始化(如我所说),映射也不会初始化(如你所说)。如果数组元素被初始化(就像使用new new)一样,映射也会被初始化(因为C++是这样工作的)。所以这完全和数组元素没有被初始化有关,其他什么都没有。对不起,我以为你说数组的时候是指映射。我的错误,我不应该假设。尝试了这个方法,但得到了同样的错误。现在我正在切换到使用new来分配数组。尝试了此方法,但得到了相同的错误。现在,我将切换到使用new来分配数组。你的话很有力,但我喜欢你的解释:)你的话很有力,但我喜欢你的解释:)