我正在构建一个结构,其中一个成员是一个地图 第一个问题是允许的吗?编译器没有抱怨。
struct A {
map<int, float> B;
}
稍后我声明了一个这样的数据类型的数组。
A *C = (A *)INTERNAL_CALLOC(..., sizeof(A));
这里函数INTERNAL_CALLOC
是MALLOC的功能包装器
稍后在代码中,当我尝试第一次将项插入到数组的第一个元素的映射中时,我得到了一个核心转储。
C[0].B[0] = 0.001;
知道为什么会这样吗? 谢谢!
答案 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;
然后不需要打扰内存分配。