2015-06-17 148 views
0

在編譯我的代碼時,我在代碼中發現了一個分段錯誤,但實際上並不瞭解它們。 我不在尋找我的代碼的答案更多的東西,這將幫助我瞭解什麼是分段錯誤,以及爲什麼發生。可以參考,這裏是我正在研究的代碼(我知道它不是一個很好的解決方法,但我仍然在學習)。分段錯誤

void PhoneBook::verifyAllContacts() { 
    Contact* listOfNumbers; 
    listOfNumbers = new Contact[numContacts]; 
    int tempHoldCount = 0; 

    for(int i = 0; i < numContacts; i++) { 
     if(listOfNumbers[i].verifyPhoneNumber() == true && listOfNumbers[i].getEmergencyContact()->verifyPhoneNumber() == true) 
      tempHoldCount++; 
    } 

    Contact* validContactList; 
    validContactList = new Contact[tempHoldCount]; 

    for(int z = 0; z < tempHoldCount; z++) { 
     for(int s = 0; s < numContacts; s++) { 
      if(listOfNumbers[s].verifyPhoneNumber() == true && listOfNumbers[s].getEmergencyContact()->verifyPhoneNumber() == true) 
       validContactList[z] = listOfNumbers[s]; 
     } 
    } 

    delete listOfNumbers; 
} 
+0

你想做什麼? 'validContactList [z] = listOfNumbers [s];'這行看起來沒有什麼用處,因爲'validContactList'是一個函數範圍的符號;即當函數返回時它將被銷燬,留給你一個內存泄漏,包含你用'validContactList = new Contact [tempHoldCount];創建的所有聯繫人「 – Eric

回答

0

段故障時您的代碼訪問的什麼存儲器被分配給所使用的變量被外部存儲器一般發生。 I.E.

int myarray[10]; 

for(int i=0;i<=10;i++) 
{ 
    myarray[10] = 0; 
} 

將創建運行時段故障因爲myArray的[10]是不是一個聲明的變量,因爲myArray的僅具有10次迭代(0-9)不11

0

由於您使用new []分配內存爲lisOfNumbers ,您需要使用

delete [] listOfNumbers; 

這可能無法解決您的分段故障問題,但這是正確的做法。嚴格來說,使用

delete listOfNumbers; 

是造成未定義的行爲。