1

基本的に、私は宿題に取り組んでおり、多項式の係数と指数を含むリンクされたリストがあります。copy 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

p1との両方p2が値によって に渡される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のインスタンスのデストラクタが呼び出されたときに問題が発生しました

解決策は「三つのルール」を使用します。これは、複雑なオブジェクト(ポインター/参照などのメンバーを含むもの-特別なメンバー関数を実装する場合:コピーコンストラクター、代入演算子、コンストラクター)を使用することを意味します。これにより、ディープコピーを実行できます。

于 2013-03-23T03:44:19.903 に答える