我有一个结构,其中以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构造函数中的列表调用任何构造函数或初始化程序?
你们怎么看?
答案 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非常相似的原因(我认为是原因之一),因此,正如其他解决方案所建议的那样,我们可以进行适当的初始化调用(即构造函数)。
因此解决方案是使用其他人建议的位置新运算符。