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

Is it safe to memset() an std::iterator variable before assigning?

本文关键字:std itrator 变量 安全 是否 一个 分配 memset      更新时间:2023-10-16

这段代码安全吗?

int main() {
    struct {
        int foo;
        int bar;
        std::list<...>::iterator it;
    } foobar;
    memset(&foobar, 0, sizeof(foobar));
    foobar.it = ...;
}

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

No.赋值运算符通常假定其左侧(收件人)操作数在赋值前具有有效状态。

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

memset()任何

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

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

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

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