在分配之前,memset()是一个std :: iterator变量是否安全?

时间:2012-11-17 02:28:26

标签: c++ std

这段代码安全吗?

int main() {

    struct {
        int foo;
        int bar;
        std::list<...>::iterator it;
    } foobar;

    memset(&foobar, 0, sizeof(foobar));

    foobar.it = ...;
}

我认为这是安全的,因为std::iterator似乎没有覆盖operator=。这是一个有效的推理吗?

3 个答案:

答案 0 :(得分:7)

没有。赋值运算符通常假定其左侧(接收方)操作数在赋值之前具有有效状态。

与此同时,您正在将这些零值压缩为std::list<...>::iterator类型的非平凡构造对象。这只能使您对std::list<...>::iterator的确切属性有深入的了解,并且您知道用零填充它会产生有效的对象。

答案 1 :(得分:6)

memset()任何非平凡的类型都是一个坏主意。完全没必要:只需初始化值:

struct {
    int foo;
    int bar;
    std::list<...>::iterator it;
} foobar = {};

它具有更快的优势,也可以做正确的事情!

答案 2 :(得分:2)

你应该从不拥有构造函数的memset类型。你不知道迭代器的内部结构,所以你不应该用锤子砸它。