使用stl map作为struct的成员

时间:2013-01-11 01:05:09

标签: c++ stl map

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

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

稍后我声明了一个这样的数据类型的数组。

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

这里函数INTERNAL_CALLOC是MALLOC的功能包装器 稍后在代码中,当我尝试第一次将项插入到数组的第一个元素的映射中时,我得到了一个核心转储。

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

知道为什么会这样吗? 谢谢!

6 个答案:

答案 0 :(得分:5)

是的,结构中的地图很好。

malloc分配肯定是罚款;不调用构造函数。因此,当您尝试使用它时,您的地图很可能会做一些可怕的事情。

一般经验法则:不要在C ++中使用malloc / calloc / realloc / free。尽可能避免动态分配,并在不可避免时使用new / delete *

<小时/> *并阅读智能指针

答案 1 :(得分:2)

如果你真的必须使用INTERNAL_CALLOC进行分配,那么请使用placement new。

首先,您必须为类型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);

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

通过用零字节填充内存来获得有效的std::map<whatever...>

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

答案 5 :(得分:0)

由于您使用std::map作为会员, 我建议使用std::vector而不是plain array作为容器。

您可以执行以下操作:

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;

然后不需要打扰内存分配。