2013-01-11 63 views
1

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

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

后来我声明了这样的数据类型的数组。

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

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

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

任何想法为什么是这种情况?
谢谢!

+0

代码部分没有出来的权利。结构A之后的行是“map B”; – elgnoh

+3

你不应该使用'malloc'来分配C++对象(你的结构是)。你应该使用'new'。 –

回答

5

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

分配malloc肯定是不是好;该构造函数不被调用。所以当你尝试使用它时,你的地图很可能会做一些糟糕的事情。

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


*而就智能指针阅读起来。

+0

我该怎么做才能确保构造函数被调用?谢谢。 – elgnoh

+0

@elgnoh:查看更新的答案。 –

+0

会给新的/删除一个尝试。谢谢 – elgnoh

0

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

+0

它根本不初始化地图*,与元素无关。 –

+0

@Ed数组元素是A类的。数组元素是类A的成员,所以如果数组元素没有初始化(就像我说过的),那么映射也不会被初始化(就像你说的那样)。如果数组元素已初始化(如使用operator new []时所用的那样),那么映射也将被初始化(因为这就是C++的工作原理)。所以它恰好与数组元素没有被初始化,没有别的。 – Oswald

+0

对不起,我以为你说数组的时候是指地图。我的错误,我不应该假设。 –

0

通过填充零字节的内存不会得到有效的std::map<whatever...>

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

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

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

+0

你的话很强,但我喜欢你的解释:) – elgnoh

2

如果您确实必须使用INTERNAL_CALLOC进行分配,请使用新的展示位置。

首先,你必须定义为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); 
+0

试过这种方法,但得到了同样的错误。现在我正在切换到使用new来分配数组。 – elgnoh

0

由于您使用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; 

然后没有需要内存分配打扰。

相关问题