stl :: unordered_map和stl :: vector的破坏有什么不同

Taz*_*ngo -5 c++ c++11 c++14

我正在寻找更详细的答案,而不是UB是UB.

我有一段遗留代码,我知道是异常的罪魁祸首.我们以前memset一个向量,一旦它被更改为unordered_map,它就会在销毁时抛出异常.在源代码中,memsetting一个向量与unordered_map有什么不同?它们都与连续的记忆相互作用......

在我们的代码中,我们有这个.(我为伪代码道歉,但重点应该是可以理解的......)

class B
{
    std::vector<CustomObject> vect;
};

struct STRUCT_A
{
    B b;
};
Run Code Online (Sandbox Code Playgroud)

后来我们这样做......

STRUCT_A m_struct_a;
memset(&m_struct_a, 0, sizeof(STRUCT_A));
Run Code Online (Sandbox Code Playgroud)

即使我们memset一个stl :: container,这个工作也很好!但是,如果我们将类B更改为具有映射,则析构函数上会发生异常.

class B
{
    std::map<CustomObject> vect;
};
Run Code Online (Sandbox Code Playgroud)

所以我认为它与矢量是连续的有关,所以我把它改成了unordered_map

class B
{
    std::unordered_map<CustomObject> vect;
};
Run Code Online (Sandbox Code Playgroud)

析构函数仍然会抛出异常.我觉得这很有趣,并认为这是一个很好的问题......

Bat*_*eba 7

是的,::memset对于包含STL容器的类的实例,它确实是一种绝对疯狂的行为.

更一般地说,你只能调用memset一个易于复制的对象.否则,程序的行为是不确定的.

有关详细信息,请参阅http://en.cppreference.com/w/cpp/string/byte/memsethttp://en.cppreference.com/w/cpp/types/is_trivially_copyable

  • @PasserBy如果是这种情况并不意味着它不是可以轻易复制的? (3认同)