1

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

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

后来我声明了一个这种数据类型的数组。

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

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

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

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

4

6 回答 6

6

是的,结构中的映射很好。

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

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


* 并阅读智能指针

于 2013-01-11T01:07:36.623 回答
3

如果您确实必须使用 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);
于 2013-01-11T01:37:47.937 回答
1
A *C = (A *)INTERNAL_CALLOC(..., sizeof(A));  

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

于 2013-01-11T01:28:18.693 回答
0

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

于 2013-01-11T01:07:16.410 回答
0

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

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

于 2013-01-11T01:08:34.307 回答
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;

那么就不需要担心内存分配了。

于 2013-01-11T04:50:55.593 回答