这段代码安全吗?
int main() {
struct {
int foo;
int bar;
std::list<...>::iterator it;
} foobar;
memset(&foobar, 0, sizeof(foobar));
foobar.it = ...;
}
我认为它是安全的,因为std::iterator
似乎没有覆盖operator=
. 这是一个有效的推理吗?
不会。赋值运算符通常假定其左侧(接收者)操作数在赋值之前具有有效状态。
同时,您正在将这些零压在可能非平凡构造的std::list<...>::iterator
类型对象上。这只能在您对它的确切属性有深入了解的情况下起作用,std::list<...>::iterator
并且您知道用零填充它会产生一个有效的对象。
memset()
任何非平凡的类型都是一个坏主意。这也是完全没有必要的:只需初始化值:
struct {
int foo;
int bar;
std::list<...>::iterator it;
} foobar = {};
它具有更快并且做正确的事情的明显优势!
你永远不应该拥有构造函数的 memset 类型。你不知道迭代器的内部结构,所以你不应该用锤子敲它。