我们可以在创建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::vector
,std::set
等
如果我们在内部执行mem_set()
到stl容器会发生什么?
答案 0 :(得分:2)
你提出的是未定义的行为,并且鉴于标准库的流行实现,即使偶然也没有机会做任何有用的事情。
答案 1 :(得分:2)
我们可以为std :: map或std :: list做一个mem_set()[...?]
没有。 std::map
和std::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()?