我正在编写并从二进制文件中读取size_t
。写作看起来像:
std::string result;
result.append((char *)&block_size_, sizeof(block_size_));
在此之后不久result
被写入文件。
但是当我以同样的方式阅读时:
map_binary.copy((char *)&block_size_, sizeof(block_size_), offset);
我收到警告
warning C4996: 'std::basic_string<_Elem,_Traits,_Alloc>::copy': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring(1777) : see declaration of 'std::basic_string<_Elem,_Traits,_Alloc>::copy'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>
1> ]
我无法理解为什么这段代码不安全并且寻找解决方案而不是假装完全没有问题(使用-D_SCL_SECURE_NO_WARNINGS
)。
那么,我错过了什么?
PS:现在我只使用标准库学习C ++,因此使用boost
或其他内容的解决方案是不可接受的。
答案 0 :(得分:1)
你没有遗漏任何东西。如果你将任何东西复制到指针,VC ++非常热衷于警告你。在这种情况下,无法保证您将获得正确的目的地大小。毕竟,您可能会编写类似map_binary.copy((char *)&block_size_, 4, offset);
的内容,然后使用64位编译器查找代码失败。
如果您对避免此类错误的能力感到满意,请禁用或忽略该警告。