我正在训练我的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 +()返回一个常量uli ,而不会在使用前被解构函数销毁。
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;

最佳答案

您需要遵循 Rule of Three



问题的根本原因:
在您的情况下,当您从重载的uli中通过复制返回类operator +实例时,将使用编译器生成的隐式拷贝构造函数,它会生成指针的浅表拷贝,因此多个指针指向相同的内存地址以及它们中的一个/某些指针(临时对象)被销毁,指向的内存通过析构函数被释放,并留下其他指向内存/内容不存在的指针(悬挂)。

解决方案:
遵循三则规则,并实现自己的拷贝构造函数以执行所涉及指针的 Deep Copying

09-06 04:48