如何在malloc内存中初始化非POD数据

时间:2018-10-22 13:46:17

标签: c++

我有一个结构,其中以std :: list作为其数据成员。该std :: list是std :: pair的集合。

赞(内部.h文件)

extern struct_info tt;
typedef struct_s *struct_info;
typedef 
struct struct_s {
  std::list < std::pair <char*, int> > names;
};

我正在为我的.cpp文件中的该结构分配内存,

tt = mem_malloc(sizeof(struct_t));

mem_malloc是我自己的内存分配例程。请注意,它已经在.h文件中设为外部。

稍后,当我尝试使用以下代码将任何元素推回列表中时:

std::pair <char*, int> myPair = std:make_pair("A", 5);
(tt->names).push_back(myPair);

执行push_back时会崩溃。我不知道这里发生了什么。我是否需要为struct_s构造函数中的列表调用任何构造函数或初始化程序?

你们怎么看?

2 个答案:

答案 0 :(得分:5)

您不能只分配大小为sizeof(struct_t)的内存,并希望能够像存在一个struct_t实例一样使用该内存-您需要首先构造它。例如

tt = mem_malloc(sizeof(struct_t));
new (tt) struct_s{}; // <- "placement `new`"

// use `tt`...

tt->~struct_s(); // <- explicit destructor call
// deallocate tt

但是,这是一个可怕的想法,尤其是如果手动完成。标准库提供了分配器支持-您应该创建一个可以与标准库无缝使用的分配器。

答案 1 :(得分:-2)

您还可以执行以下操作: struct_s obj; * tt = obj; 。 。 。 free(tt);

经过实验:    1.对于非POD类型,我建议的解决方案将(必须)不起作用。    2.对于非POD类型,如果应用了上述复制机制,它将开始访问未初始化的内存位置(在复制到位置中),并假设它们是格式正确的对象,因此会导致分段错误。    3.第2点使得必须为非POD类型的数据正确初始化此类已分配的内存。在C中这是不可能的,并且因为所有的东西都是POD,所以我们也不会遇到这种情况。这是C ++结构与Class非常相似的原因(我认为是原因之一),因此,正如其他解决方案所建议的那样,我们可以进行适当的初始化调用(即构造函数)。

因此解决方案是使用其他人建议的位置新运算符。