C++ std::map或std::list的内存集

C++ std::map或std::list的内存集,c++,list,map,stl,C++,List,Map,Stl,我们可以在创建后立即为std::map或std::list执行mem_set()。例如 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)

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

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));
typedef std::map MY_map;
typedef std::列出我的列表;
MY_MAP*MAP_obj=新建MY_MAP();
mem_集(map_obj,0,sizeof(MY_map));
我的清单;
mem_set(&mylist,0,sizeof(MY_LIST));
我继续进行正常的stl操作

map_obj->insert(std::make_pair<int, double> (1, 2.2));
mylist.push_back(1);
map_obj->insert(std::make_pair(1,2.2));
我的列表。推回(1);

执行<代码> MyIsStand()>代码>是正确的,如果它是正确的,我也可以像其他的STL C++容器一样,如<代码> STD::vector < /代码>,<代码> STD::SET//COD> ET/<


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

您建议的是未定义的行为,并且考虑到标准库的流行实现,即使是意外,它也没有机会做任何有用的事情。

您建议的是未定义的行为,鉴于标准库的流行实现,即使是偶然的,它也没有机会做任何有用的事情

我们可以为std::map或std::list[…?]执行mem_set()吗

不。
std::map
std::list
是非类型的族。你不应该在这样低的层次上打乱他们的内部表现。除了UB之外,您很可能会违反类型的内部不变量。这同样适用于
std::string

但是,这些类型的默认构造函数已经创建了一种“零状态”的对象。也就是说,它们将是“空的”/不包含任何元素

执行mem_set()正确吗

没有

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

没什么好的。这些类型是非豆荚是有原因的。他们有“私人部分”,任何人都不应该直接在这个层面上搞砸

我们可以为std::map或std::list[…?]执行mem_set()吗

不。
std::map
std::list
是非类型的族。你不应该在这样低的层次上打乱他们的内部表现。除了UB之外,您很可能会违反类型的内部不变量。这同样适用于
std::string

但是,这些类型的默认构造函数已经创建了一种“零状态”的对象。也就是说,它们将是“空的”/不包含任何元素

执行mem_set()正确吗

没有

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


没什么好的。这些类型是非豆荚是有原因的。他们有“私人部分”,任何人都不应该直接在这一层上乱来。

你想实现什么


当您调用
newmyu-MAP()时,它为映射分配内存并运行构造函数。这将使地图处于已知的有效状态。通过调用
men\u set
(memset?)可以将映射中的所有内容设置为零,几乎可以肯定会使映射处于无效状态。在这张地图上插入东西会失败,希望是早一点,而不是晚一点。

你想完成什么


当您调用
newmyu-MAP()时,它为映射分配内存并运行构造函数。这将使地图处于已知的有效状态。通过调用
men\u set
(memset?)可以将映射中的所有内容设置为零,几乎可以肯定会使映射处于无效状态。将内容插入此映射将失败,希望不会太晚。

我提出上述问题的原因来自以下实现

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;
struct my\u struct{
INTA;
双b[100];
映射我的地图;
std::vector my_vector;
}我的结构;
对上述结构执行memset()将尝试初始化映射和向量,
那么,如果struct对象包含STL容器,那么是否允许对其执行memset()?

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

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;
struct my\u struct{
INTA;
双b[100];
映射我的地图;
std::vector my_vector;
}我的结构;
对上述结构执行memset()将尝试初始化映射和向量,
因此,如果结构对象包含STL容器,是否允许对其执行memset()操作?

由于新映射或列表还没有任何内容,因此尝试将其内容归零没有意义。
mem\u set
?你的意思是
memset
?我建议永远不要这样做(请参阅“未定义的行为”注释)。删除
new
s和
memset
s,您的代码应该正常。您可能一开始也不想使用
MY_MAP::insert
,当然,只使用
操作符[]
,这是毫无意义的。你为什么要这么做?您希望得到什么效果?尝试将新地图或列表的内容归零没有意义,因为它们还没有任何内容。
mem\u set
?你的意思是
memset
?我建议永远不要这样做(请参阅“未定义的行为”注释)。删除
new
s和
memset
s,您的代码应该正常。您可能一开始也不想使用
MY_MAP::insert
,当然,只使用
操作符[]
,这是毫无意义的。你为什么要这么做?你预计会有什么影响?我猜你的最后一句应该是个问题。如果是这样,答案是“不!”。我想你的最后一句应该是一个问题。如果是这样,答案是“不!”。