【发布时间】:2015-06-09 16:01:52
【问题描述】:
我第一次编写了一个可以用作std::map<> 的键类型的类。我已经重载了复制构造函数、赋值和operator <,正如其他关于 SO 的问题中所建议的那样。但是由于某种原因,当我尝试使用operator [] 插入时它会崩溃。此类用于保存二进制数据的缓冲区,其长度由成员 m_nLen 指示。
代码如下:
class SomeKeyClass
{
public:
unsigned char m_buffer[ SOME_LENGTH_CONSTANT ];
size_t m_nLen;
public:
inline SomeKeyClass( const unsigned char * data, size_t nLen )
{
m_nLen = min( SOME_LENGTH_CONSTANT, nLen );
memcpy( m_buffer, data, m_nLen );
}
inline SomeKeyClass( const SomeKeyClass& oKey )
{
*this = oKey;
}
inline bool operator < ( const SomeKeyClass& oKey ) const
{
return memcmp( m_buffer, oKey.m_buffer, min( m_nLen, oKey.m_nLen ) ) < 0;
}
inline SomeKeyClass & operator = ( const SomeKeyClass& oKey )
{
memcpy( m_buffer, oKey.m_buffer, oKey.m_nLen );
return *this;
}
};
这个类有什么问题吗?我可以使用std::string<unsigned char> 来代替使用二进制数据作为键吗?
【问题讨论】:
-
您没有在复制构造函数和赋值运算符中设置
m_nLen成员。是的,std::string可用于二进制数据。但是您不需要覆盖复制构造函数或赋值运算符——结构或类中的数组将正确复制。 -
是的,现在可以了,谢谢。
-
为了使其防弹,您应该在 memcpy 等之前检查零长度。您可能认为 0 等于无操作,但我曾看到意外通过 0 时发生崩溃。
-
我建议使用
std::vector<unsigned char>来处理简单的二进制缓冲区。比std::string更好,比原始指针更简单、更安全。 -
@donjuedo
memcmp(p1, p2, 0)如果p1或p2为空,则为未定义行为
标签: c++ templates dictionary stl key