如何在 malloc 内存中初始化非 POD 数据
How to initialize non-POD data in malloc memory
我有一个结构,它有一个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 非常相似,因此,正如其他解决方案中所建议的那样,我们可以进行适当的初始化调用(即构造函数(。
因此,解决方案是按照其他人的建议使用放置新运算符。
相关文章:
- 如何在 malloc 内存中初始化非 POD 数据
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 非 POD 的零初始化
- 如何让MSVC编译器优化多步POD初始化?
- 默认情况下初始化时 POD 是否给予特殊处理 (C++14)?
- 类POD成员变量初始化
- C++函数中的多线程静态 POD 初始化
- 初始化新对象时C++默认构造函数和 POD 问题
- POD成员默认初始化无括号
- 视觉C++似乎正在零初始化一个不应该的类的 POD 成员
- 如何在派生类中初始化继承的模板POD结构
- 构造函数初始化列表中POD类型的初始化
- 使用初始化列表的 POD 类型初始化不起作用
- 继承的 POD 类型的值初始化
- 初始化POD数组中的第一个元素,保持其余元素未初始化
- POD变量的直接初始化不起作用,但当将变量推到向量上时,复制初始化起作用
- POD 类对象初始化是否需要构造函数
- 为什么在初始化项列表中初始化 POD 数据时必须使用 C 样式类型转换
- 如何使用C++中的括号语法初始化POD数组
- 获取默认初始化(NOT value/零初始化)POD作为右值