我一直在四处寻找并认为我的大部分内容都在一起,但我的代码仍然无法工作......
我有一张地图,
map<Number, Entry> chainList;
和一个类号和条目,我们现在不担心的条目,因为我很确定这一半是正确的
in Number.h
class Number
{
public:
//Public Functions
//Constructor/Destructor
Number(int len);
Number(string copy);
Number(const unsigned char *copy, int len);
Number(const Number& in);
~Number();
.......
.......
friend void swap(Number& first, Number& second);
bool operator<(const Number& rhs) const;
Number& operator=(Number &rhs);
private:
//our binary number array
unsigned char *num;
//hold the length used, and maxsize of the array
int length;
};
然后,
//in Number.cpp
Number::~Number()
{
delete [] num;
}
Number::Number(const Number& in)
{
length = in.length;
num = (unsigned char *) calloc(length, sizeof(unsigned char));
for (int i = 0; i < length; i++)
{
num[i] = in.num[i];
}
}
bool Number::operator<(const Number& rhs) const
{
if (this -> length > rhs.length)
{
return false;
}
for (int i = 0; i < this -> length; i++)
{
if (this -> num[i] > rhs.num[i])
{
return false;
}
else if (this -> num[i] < rhs.num[i])
{
return true;
}
}
return false;
}
void swap(Number& first, Number& second)
{
// enable ADL (not necessary in our case, but good practice)
using std::swap;
// by swapping the members of two classes,
// the two classes are effectively swapped
swap(first.length, second.length);
swap(first.num, second.num);
}
Number& Number::operator=(Number &rhs)
{
swap (*this, rhs);
return *this;
}
然而,当我尝试将一个项目插入地图时,我得到一个seg错误....
in Database.cpp
....
chainList.insert(pair<Number, Entry>(*(tempEntry -> msgHash), *tempEntry));
.....
其中tempEntry - &gt; msgHash是一个数字* - 动态分配
我的问题是什么?另一个选择是我有一个类型转换并返回一个c ++字符串的函数,我的问题是std :: less_than函数是否在语句中间使用空字符,我知道它在lexigraphical顺序工作,但它是由第一个空?
答案 0 :(得分:2)
我认为问题出在operator<()
:
if (this->length > rhs.length)
return false;
for (int i = 0; i < rhs.length; i++)
....
请参阅?如果rhs.length
大于this->length
,则继续比较字节数。但是,您最多可以比较rhs.length
字节,并且可能会溢出this->num
,因为this->length
小于或等于rhs.length
。
我不确定您是否需要特定的排序顺序,但我会做类似的事情:
if (this->length > rhs.length)
return false;
if (this->length < rhs.length)
return true;
for (int i = 0; i < rhs.length; i++)
....
现在,当你到达循环时,你确定两个数组的长度相同。
<强>更新强>
operator=(Number &rhs)
中还有另一个重要问题。该操作员不应修改右侧操作员。所以它应该是operator=(const Number &rhs)
或operator=(Number rhs)
,但绝不是非const引用,就像你的那样。
您正在尝试实现复制和交换习惯用法。你得到的几乎是正确的,正确的方法是:
Number& Number::operator=(Number rhs)
{
swap (*this, rhs);
return *this;
}
更新#2 :
您使用calloc()
分配数组,但使用delete[]
释放它。这是未定义的行为。分配有calloc()
的内存将被free()
释放,分配有new[]
的内存将被delete[]
释放。
我的建议是使用std::vector<unsigned char>
来保存动态数组,并避免使用this->length
,delete[]
等所有内容。只需对向量执行std::swap()
即可。