2015-06-17 151 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; 

是造成未定义的行为。