我正在寻找更详细的答案,而不是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)
析构函数仍然会抛出异常.我觉得这很有趣,并认为这是一个很好的问题......
是的,::memset对于包含STL容器的类的实例,它确实是一种绝对疯狂的行为.
更一般地说,你只能调用memset一个易于复制的对象.否则,程序的行为是不确定的.
有关详细信息,请参阅http://en.cppreference.com/w/cpp/string/byte/memset和http://en.cppreference.com/w/cpp/types/is_trivially_copyable
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |