mem_set用于std :: map或std :: list

时间:2014-03-26 13:23:30

标签: c++ list map stl

我们可以在创建mem_set()std::map后立即std::list。例如,

typedef std::map<int, double> MY_MAP;
typedef std::list<int> MY_LIST;
MY_MAP *map_obj = new MY_MAP();
mem_set(map_obj, 0, sizeof(MY_MAP));
MY_LIST mylist;
mem_set(&mylist, 0, sizeof(MY_LIST));

我继续正常的stl操作

map_obj->insert(std::make_pair<int, double> (1, 2.2));
mylist.push_back(1);

执行mem_set()是否正确,如果它是正确的,我可以对其他STL c ++容器执行类似操作,例如std::vectorstd::set

如果我们在内部执行mem_set()到stl容器会发生什么?

4 个答案:

答案 0 :(得分:2)

你提出的是未定义的行为,并且鉴于标准库的流行实现,即使偶然也没有机会做任何有用的事情。

答案 1 :(得分:2)

  

我们可以为std :: map或std :: list做一个mem_set()[...?]

没有。 std::mapstd::list是非POD类型的系列。你不应该在这个低级别上混淆他们的内部表示。除了UB之外,你很可能会违反类型的内部不变量。 std::string也是如此。

但是,这些类型的默认构造函数已经创建了一种&#34;零状态&#34;。也就是说,他们将是空的&#34; /不包含任何元素。

  

执行mem_set()

是否正确

没有

  

如果我们在内部对stl容器执行mem_set()会发生什么?

没什么好的。出于某种原因,这些类型是非POD。他们有私人部分&#34;没有人应该直接在那个级别搞乱。

答案 2 :(得分:1)

你想要完成什么?

当您调用new MY_MAP();时,它会为地图分配内存,而会运行构造函数。这使地图成为已知的有效状态。通过调用men_set memset ?),您将地图中的所有内容设置为零,几乎可以肯定地将地图置于某种无效状态。将内容插入到此地图中将会失败,希望能够更快而不是更晚。

答案 3 :(得分:0)

上述问题的原因来自以下实施。

MY_STRUCT *new_struct = new MY_STRUCT;
memset(new_struct,0,sizeof(MY_STRUCT));

一旦结构被定义为

,这将完美地工作
struct my_struct{
int a;
double b[100];
}MY_STRUCT;

但如果结构定义如下

struct my_struct{
int a;
double b[100];
std::map<int,double> my_map;
std::vector<int> my_vector;
}MY_STRUCT;

为上述结构执行memset()会尝试初始化地图和矢量, 如果它们包含STL容器,它是否允许对struct对象执行memset()?