在分配之前,memset() 一个 std::itrator 变量是否安全
Is it safe to memset() an std::iterator variable before assigning?
这段代码安全吗?
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类型。你不知道迭代器的内部结构,所以你不应该用锤子敲打它。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- 为什么 std::itrator 无法访问该函数
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- 为什么 std::d istance() 对于 std:list:<int>:itrator 在 last 在 first 之前时不返回负数?
- 在分配之前,memset() 一个 std::itrator 变量是否安全
- Vector::<int>迭代器与 list::<int>itrator 键在 std::map
- 'deque itrator not dereferencable' 而做 std::d eque->front()