1

所以,基本上,我正在做作业,我有一个包含多项式系数和指数的链表。当不包含复制 c-tor 时,退出 main(析构函数)时代码会崩溃。使用 copy c-tor 它不会发生,但我想知道为什么因为我没有在任何地方明确调用 copy c-tor。这只是一段代码。Coef 函数将带有参数 exp 和 coef 的节点添加到列表中,因此我认为不需要包含它。

CPList :: ~CPList ()
{
    while (!isEmpty())
        deleteFromHead();
}

void CPList :: deleteFromHead ()
{
    CPNode* tmp=head;
    if (head==tail)
        head=tail=NULL;
    else head=head->next;
    delete tmp;
}
CPList* CPList :: mul (CPList p1, CPList p2)
{
    CPList* res = new CPList;
    CPNode *first, *second;
    for (first=p1.head; first!=NULL; first=first->next)
        for (second=p2.head; second!=NULL; second=second->next)
            res->coef(first->exp+second->exp, first->coef*second->coef);
    res->check();
    return res;
}

它在这段代码之后的右括号处崩溃。

int main ()
{
...
    ptr=p3.mul(p1, p2);
    ptr->printall();
}

当包含 copy c-tor 时,它可以正常工作。

4

2 回答 2

1

两者p1p2都通过值传递到mul,因此创建副本,然后在mul返回时销毁。

于 2013-03-23T03:16:52.073 回答
0
CPList* CPList :: mul (CPList p1, CPList p2) {//code}

当您按值传递并且尚未实现默认复制构造函数时 - 为简单(内置类型)创建对象的浅表副本(这意味着简单地复制成员的所有值), 但如果您有成员在像指针或引用&*这样的类中,它们的值被复制,这是不好的,因为: 例如:


class A
{
A(){new m_pOnInt};
~A(){delete m_pOnInt};
int* m_pOnInt;
}

void someFunction(A objA);

当您调用 someFunction(objA) - 提供的 A 实例的临时副本被创建并推送到堆栈中,
在函数将控制权返回给调用者之后,对堆栈中的所有对象调用函数析构函数,因此调用 ~objA();但是您仍然有作为参数提供给 someFunction 的类 A 的实例,但是应用了无效的 m_pOnInt 作为删除运算符,因此当调用 A 的实例的析构函数时出现问题

解决方案使用“3 规则”:这表示当您处理复杂对象时(包含指针/引用等成员的对象 - 实现特殊的成员函数:复制构造函数、赋值运算符、构造函数,它允许您执行深度复制。

于 2013-03-23T03:44:19.903 回答