2015-06-17 3 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

Ошибка сегментации обычно возникает, когда ваш код обращается к памяти за пределами того, какая память назначается используемой переменной. И.Е.

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; 

является причиной неопределенного поведения.

Смежные вопросы