Programma ontvangen signaal SIGSEGV, Segmentatiefout

Ok… Ik trek mijn haar eruit… Waarom krijg ik segmentatiefouten als ik een string met de naam “name” met de inhoud “joel” doorgeef

void person::setName(string newName)
{
    personName = newName;
}

Koptekstbestand:

class person {
public:
    int getID();
    string getName();
    void setID(int newID);
    void setName(string newName);
private:
    int personID;
    string personName;
};

btw… de functie-aanroep is door een kind, hoewel ik niet zie hoe dat een probleem zou kunnen veroorzaken.


Antwoord 1, autoriteit 100%

Als je Linux gebruikt, probeer dan valgrinduit te voeren. Je compileert gewoon met -g(met gcc), en voert dan je programma uit met valgrindervoor:

$ valgrind myprogram

In tegenstelling tot de GCC-oplossingen, die u vertellen wanneer de segfault optreedt, vertelt valgrind u meestal precies wanneer de eerste geheugenbeschadiging optreedt, zodat u het probleem veel dichter bij de bron kunt vinden.

PS. Het rijmt op “flint”, niet op “find”.


Antwoord 2, autoriteit 5%

Waarschijnlijk verwijst u naar een bedrieglijke pointer. Door puur giswerk, heb je misschien zoiets als dit:

Person persons[10];
 for (i=1; i<=10; i++)
     persons[i].setName("joel");

Het probleem kan zijn:

  • de fout zoals getoond, de index is gebaseerd op 0, dus je hebt for (i=0; i<10; i++)
  • nodig

  • als de array dynamisch is toegewezen, maar de index is nog steeds buiten de grenzen

Er kunnen letterlijk honderden andere oorzaken zijn, maar aangezien ik uw code niet heb, is dit mijn poging om de meest plausibele fouten te raden 😉

(Opmerking voor mezelf: waarom doe ik dit/ik ben niet paranormaal begaafd?)


Antwoord 3

De code ziet er goed uit, afgezien van het feit dat je de hele tijd strings kopieert. In plaats van

void setName(string newName);

zou moeten zijn

void setName(const string& newName);

Het probleem moet in de methodeaanroep zitten.

Other episodes