1

这段代码安全吗?

int main() {

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

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

    foobar.it = ...;
}

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

4

3 回答 3

7

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

同时,您正在将这些零压在可能非平凡构造的std::list<...>::iterator类型对象上。这只能在您对它的确切属性有深入了解的情况下起作用,std::list<...>::iterator并且您知道用零填充它会产生一个有效的对象。

于 2012-11-17T02:31:15.570 回答
6

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

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

它具有更快并且做正确的事情的明显优势!

于 2012-11-17T02:31:33.610 回答
2

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

于 2012-11-17T02:32:12.517 回答