C++ C++;自定义标准::映射<&燃气轮机;导致内存冲突的密钥类

C++ C++;自定义标准::映射<&燃气轮机;导致内存冲突的密钥类,c++,templates,dictionary,stl,key,C++,Templates,Dictionary,Stl,Key,我第一次编写了一个类,该类应该可以用作std::map的键类型。我重载了复制构造函数、赋值和运算符问题是您没有在复制构造函数或赋值运算符中设置m_nLen成员。因此,每当您使用具有未初始化或错误的m_nLen值的对象时,可能会出现错误,导致可能的崩溃(通常是未定义的行为) 在实现用户定义的复制构造函数和赋值运算符时,您应该努力确保最终生成的是相关对象的实际副本(引用计数对象是一种特殊情况,但它仍然意味着正在进行复制)。否则,生成对象的不完整或错误副本的程序非常脆弱,调试负担也非常沉重 问题在于您

我第一次编写了一个类,该类应该可以用作
std::map
的键类型。我重载了复制构造函数、赋值和
运算符问题是您没有在复制构造函数或赋值运算符中设置
m_nLen
成员。因此,每当您使用具有未初始化或错误的
m_nLen
值的对象时,可能会出现错误,导致可能的崩溃(通常是未定义的行为)


在实现用户定义的复制构造函数和赋值运算符时,您应该努力确保最终生成的是相关对象的实际副本(引用计数对象是一种特殊情况,但它仍然意味着正在进行复制)。否则,生成对象的不完整或错误副本的程序非常脆弱,调试负担也非常沉重

问题在于您没有在复制构造函数或赋值运算符中设置
m_nLen
成员。因此,每当您使用具有未初始化或错误的
m_nLen
值的对象时,可能会出现错误,导致可能的崩溃(通常是未定义的行为)


在实现用户定义的复制构造函数和赋值运算符时,您应该努力确保最终生成的是相关对象的实际副本(引用计数对象是一种特殊情况,但它仍然意味着正在进行复制)。否则,生成对象的不完整或错误副本的程序非常脆弱,调试负担也非常沉重

查看Paul McKenzie的答案,了解它崩溃的原因

这门课有什么问题吗


是的,您的
操作员请参阅Paul McKenzie的答案,了解其崩溃的原因

这门课有什么问题吗


是,您的
运算符您没有在复制构造函数和赋值运算符中设置
m\u nLen
成员。是的,
std::string
可以用于二进制数据。但您不需要覆盖复制构造函数或赋值运算符——结构或类中的数组将正确复制。是的,它现在可以工作了,谢谢。为了使它防弹,您应该在memcpy等之前检查长度是否为零。您可能认为0等于无操作,但我看到过0意外通过时崩溃的情况。我建议对简单的二进制缓冲区使用
std::vector
。优于
std::string
,比原始指针更简单、更安全。@donjuedo
memcmp(p1,p2,0)
是未定义的行为,如果
p1
p2
为空,则在复制构造函数和赋值运算符中都未设置
m_nLen
成员。是的,
std::string
可以用于二进制数据。但您不需要覆盖复制构造函数或赋值运算符——结构或类中的数组将正确复制。是的,它现在可以工作了,谢谢。为了使它防弹,您应该在memcpy等之前检查长度是否为零。您可能认为0等于无操作,但我看到过0意外通过时崩溃的情况。我建议对简单的二进制缓冲区使用
std::vector
。优于
std::string
,比原始指针更简单、更安全。@donjuedo
memcmp(p1,p2,0)
是未定义的行为,如果
p1
p2
为空,这将解释我遇到的一些问题。如果它们的长度相等,最短的也是最小的对吗?是的,没错,我已经用正确的实现更新了答案。谢谢,这可以解释我遇到的一些问题。如果它们的长度相等,最短的也是最小的对吗?是的,没错,我已经用正确的实现更新了答案。
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;
   }
};
bool operator<(const SomeKeyClass& oKey) const
{
  const std::size_t len = std::min(m_nLen, oKey.m_nLen);
  if (len > 0)
  {
    const int cmp = memcmp(m_buffer, oKey.m_buffer, len);
    if (cmp != 0)
      return cmp < 0;
  }
  return m_nLen < oKey.m_nLen;
}