2014-03-26 61 views
0

我们可以在创建它们时为std::mapstd::list做一个mem_set()。对于恩,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 etc

如果我们做一个mem_set()内部stl容器会发生什么?

+0

试图将新地图或列表的内容清零是没有意义的,因为它们没有任何内容。 –

+0

'mem_set'?你的意思是'memset'? – aschepler

+0

我建议不要这样做(请参阅'未定义的行为'评论)。删除'new's和'memset's,你的代码应该没问题。你可能不想首先使用'MY_MAP :: insert',只是'operator []' –

回答

2

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

2

,我们可以做的std ::地图或std ::列表[...?]

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

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

是否正确执行mem_set()

,如果我们做一个mem_set()在内部STL容器会发生什么?

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

1

你想完成什么?

当您拨打new MY_MAP();时,它会为地图分配内存运行构造函数。这使地图进入已知的有效状态。通过调用men_setmemset?),您将地图中的所有内容都设置为零,几乎肯定会使地图处于无效状态。在这幅地图中插入东西将会失败,希望能够尽早而不迟。

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容器,它可以对结构对象执行memset()吗?

+0

我想你最后一句话应该是个问题。如果是这样,答案是“不!”。 – sellibitze