我正在训练我的C ++并且我正在尝试编写一个能够使用链接列表表示以下数字的库:
999999999 *([i = 0]Σ[999999999] 1000000000 ^ i)
例如,如果我的号码是 711381450277869054011 ,它将表示如下:
711 * 1000000000 ^ 2 + 381450277 * 1000000000 ^ 1 + 869054011 * 1000000000 ^ 0
所以,这是我的LL的结构及其功能:
typedef struct node* ll;
struct node
{
unsigned int data;
ll next;
};
bool insert(ll&, unsigned int);
// ...
void copy(ll&, ll);
void destroy(ll&);
这是我的无符号非常长的整数类:
class uli
{
public:
uli();
~uli();
// <<, >>, =, operators...
uli& operator +=(const uli&);
uli& operator +=(char*);
const uli operator +(const uli&);
private:
ll head;
};
uli::uli()
{
head = NULL;
insert(head, 0);
}
uli::~uli()
{
destroy(head);
}
+ = 运算符正常运行,我正在使用它来重载 + 运算符。
问题是我无法使方法 operator +()返回 const uli ,而不会在我使用它之前被解构器销毁。< / p>
const uli uli::operator +(const uli& rarg) // rarg: right argument
{
uli larg; // left argument
larg = *this;
larg += rarg;
return larg;
}
// returns an LL to somewhere ???? larg was destroyed.
现在我做不到Z = X + Y;
答案 0 :(得分:6)
您需要遵循 Rule of Three ,
如果你的班级需要
- 复制构造函数,
- 一个赋值运算符,
- 或析构函数,
然后它可能需要所有这三个。
问题的根本原因:
在您的情况下当您从重载的uli
复制返回类operator +
实例时,将使用编译器生成的隐式复制构造函数,它会对指针进行浅表复制,因此多个指针指向相同的内存地址当它们中的一个/一些(临时对象)被破坏时,通过析构函数释放指向内存的指针,并留下指向不存在的内存/内容的其他指针(悬空)。
<强>解决方案:强>
遵循规则三并实施您自己的复制构造函数,以执行相关指针的 Deep Copying 。