2013-03-23 86 views
1

所以,基本上,我正在做一個家庭作業,我有一個鏈表與多項式係數和指數。當不包含複製c-tor時,退出main(析構函數)時代碼會崩潰。使用複製c-tor不會發生,但我想知道爲什麼'因爲我沒有明確地在任何地方調用複製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(); 
} 

當包含複製c-tor時,它正常工作。

+1

如果您不打算調用copy-ctor或支持它,則可以通過C++ 11的語法('CPList(const CPList&)= delete;')將其刪除或聲明它作爲'private:'。這樣做會立即告訴你這個問題根源在哪裏。如果沒有一個有效的* copy-ctor來爲具有動態成員的類授予[Rule of Three/Five](http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)),那麼遲早會像這樣綁定自己的軟管。 – WhozCraig 2013-03-23 03:23:23

回答

1

p1p2都按值傳遞到mul,所以當mul返回時創建副本並將其銷燬。

+0

對,我不知道我是如何忽視這一點的。謝謝。 – rndm 2013-03-23 03:19:23

0
CPList* CPList :: mul (CPList p1, CPList p2) {//code} 

當你按值傳遞和haven`t實現默認的拷貝構造函數 - 淺拷貝創建對象(這意味着成員的所有值都只是複製)
簡單(的
內置類型)是罰款),
但如果你在課堂成員像指針或引用& *然後它們的值複製,這​​是不是很好,因爲:
例如:

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

void someFunction(A objA); 

當你調用someFunction(objA) - 創建一個所提供的實例的臨時副本並推入堆棧,
後功能控制權返回給調用函數的析構函數調用在堆棧中的所有對象,所以〜objA ()被調用; 但你仍然有類A的實例,你提供了作爲someFunction的參數,但是使用非有效的m_pOnInt作爲刪除操作符應用於它,所以當你調用例如A的析構函數時出現問題

解決方案的使用「規則3」:它說當你處理複雜的對象時(包含指針/引用的成員 - 實現特殊的成員函數:拷貝構造函數,賦值操作符,構造函數,它允許你執行深度拷貝。