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

How to initialize non-POD data in malloc memory

本文关键字:初始化 POD 数据 内存 malloc      更新时间:2023-10-16

我有一个结构,它有一个std::list作为其数据成员。那个std::list是std::p air的集合。

像这样(在.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 文件中制作为外部。

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

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

它在执行push_back时崩溃。我不知道这里发生了什么。是否需要为构造函数中的列表调用struct_s构造函数或初始值设定项?

你们怎么看?

您不能只分配大小为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

然而,这是一个糟糕的主意,特别是如果手动完成。标准库提供分配器支持- 您应该创建一个可以与标准库无缝使用的分配器。

你也可以做: struct_s obj; *tt = obj; . . . 免费(TT(;

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

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