Feil dobbeltfri eller korrupsjon

Feil dobbeltfri eller korrupsjon
Feilen med dobbeltfri eller korrupsjon i C ++ betyr at programmet vårt på en eller annen måte påkaller det gratis () C ++ -objektet med en ulovlig pekervariabel. Når vi bruker smarte pekere som Shared_PTR, må vi sjekke fordi hvis vi kaller funksjonen Get (), bruker vi direkte Raw Pointer. Vi planlegger å tilordne dette til en smart peker for fortsatt referanse. Denne korrupsjonen er den viktigste årsaken til krasjet av koden. Vi bruker gratis () -funksjonen for å fjerne minneminnet typisk. Heapminnet har hovedsakelig brukt funksjonen til operativsystemet vårt for å administrere minneplasseringene. Så her er feilen når koden vår ikke eier denne pekeren før vi kopierer koden.

Når pekeren er null:

Her viser vi bare vår gratis () funksjon hvordan det fungerer i starten; Vi inkluderer biblioteker og navneområder og starter hoveddelen av koden initialisert heltallvariabelen og initialiserte også en peker med null for å unngå feilen med dobbeltfri eller korrupsjon, og andre tips har verdien av heltallet vårt. Deretter bruker vi IF-Else-setningen for å sjekke NULL-pekeren og pekeren som har vår heltallverdi. Etter tilstanden kaller vi vår funksjon for å omfordele pekeren vår.

#inkludere
ved hjelp av navneområdet STD;
int main ()

int x = 5;
int *ptr1 = null;
int *ptr2 = & x;
if (ptr1)

cout << "Pointer is not Null" << endl;

ellers

cout << "Pointer is Null" << endl;

gratis (ptr1);
cout << *ptr2;

Ved utførelse vil utdataene se slik ut:

Hvordan det påløper:

Dette påløper hvis pekeren bruker minnetildeling eller kaller gratis () -funksjonen i C ++ direkte noen ganger. Det kan også påløper når gratis () kalles et argument til samme minneplass en eller flere enn en gang. Kodens datastruktur for minnehåndtering er blitt ødelagt eller kan ikke tillate en mistenkelig sluttbruker å oppgi verdiene på et tilfeldig minneplassering. Hvis en kode kaller gratis () -funksjonen med samme minneplass mer enn en gang.

Hvis vi sletter den samme oppføringen to ganger og sletter noe som ikke ble tildelt i minnehaugen. Dermed er pekerne den direkte årsaken til denne feilen.

#inkludere
#inkludere
#inkludere
int main ()
std :: vektor vec 0, 1, 2;
std :: vektor:: iterator it = std :: max_element (vec.Begynn (), VEC.slutt());
std :: vektor vec2 3, 4, 5;
Vec.Sett inn (VEC.slutt (), vec2.Begynn (), VEC2.slutt());
Vec.slette (IT);
for (auto & n: vec)
std :: cout << n << std::endl;

Først integrerer vi tre overskriftsbiblioteker; Den ene er #include, i standard malbibliotek er det en malklasse på programmeringsspråket. Det er en sekvensbeholder som lagrer elementer. Brukes hovedsakelig til å støtte de dynamiske dataene i C ++ programmeringsspråk. Vi kan utvide vektorene, men det avhenger av elementene som disse vektorene inneholder sammen med dem.
Den andre overskriftsfilen er #include som gir oss mange funksjonaliteter som kan være til mange formål, som å sortere elementet, støtte søkealgoritme, multiplisere verdiene, telle variabler og så videre. Sist, men ikke minst, det vil si #include at formålet er å støtte vår input-output-strøm. Etter biblioteker starter vi hovedorganet vårt der vi bruker standarder med vektorene og tildeler variabler med heltall datatype og tildeler verdier til denne variabelen.

Her er uttalelsen vår der vi tildeler variabelen vår sammen med start og endepunkt gjennom funksjonen maz_element. Gjenta uttalelsen igjen, men vi endrer verdiene våre til en annen variabel denne gangen. Deretter bruker vi innsatsfunksjonen og passerer parametrene som er sluttpunktet for vår forrige variabel, startpunktet for den andre variabelen og endepunktet på variabelen. Sletting () -funksjonen brukes til å slette et enkelt element fra vektoren og brukes også til å modifisere størrelsen på vektoren. Til slutt bruker vi for loop med grensen for vår første variabel, og i løkken viser vi variabelen som vi initialiserte i loopen vår.

Hvordan unngå:

Vi kan unngå denne typen sårbarhet; Vi må alltid tildele null til pekeren vår når det blir gratis. For det meste ignorerte Heap -ledere de gratis nullpekerne senere. Dette er den beste praksisen som vi null alle de slettede pekerne, så godt som vi også må sette en sjekk om pekeren er null eller ikke før vi frigjør pekeren. Vi må initialisere pekeren null i starten av koden vår. Som når vi prøver å bruke COUT (STD :: COUT) uttalelse.

#inkludere
ved hjelp av navneområdet STD;
int main ()

int * i = new int ();
slett i;
cout<cout<<"\npointer delete successfully";
slett i;
cout<retur 0;

Overskriftsfilen er inkludert. Så skriver vi ved hjelp av navneområdet og starter liket av hovedprogrammet. Vi initialiserte pekeren med heltalldatatypen. Her tildeler vi null til pekeren og skriver ut pekeren. Etter å ha tilordnet null, sletter vi pekeren og skriver ut suksessen om suksess. Endelig sjekker vi igjen pekeren vår, og du kan se at det ikke er noen peker som eksisterer i minneskuffen vår.

Konklusjon:

I denne artikkelen beskriver vi kort feilen dobbeltfri eller korrupsjon. Så har vi omfordelt minnet vårt ved å bruke () -funksjonen vår og diskutert årsakene til feilen og brukt eksemplet på å slette () -funksjonen. Til slutt har vi gitt en løsning en enkel og logisk løsning på denne feilen på en veldig enkel måte.