C ++ Feil avsluttet etter å ha kastet en forekomst av “stdbad_alloc”

C ++ Feil avsluttet etter å ha kastet en forekomst av “stdbad_alloc”

Siden vi er kjent med feil som kan oppstå i koden vår på grunn av en eller annen grunn, enten det er en feil gjort av koderen, versjonene eller noen andre grunner, kan det eksistere på grunn av hvilke vi møter feilene. Det er tre typer feil. Noen av dem er logiske mens noen er syntaks eller kompilerer tidsfeil. I dag vil vi diskutere en feil som kan oppstå på grunn av noen minnelaterte problemer. Denne typen problemer er noen ganger hektiske oppgaver å løse. Men i dag vil vi diskutere dem kort for å løse disse feilene. Feilen som vi vil lære blir "avsluttet kalt etter å ha kastet en forekomst av" std :: bad_alloc "". Denne feilen er relatert til minnet. En slik feil kan oppstå som et resultat av følgende:

Tildelingssvikt i minnet: Det kan oppstå på grunn av at de store delene av minnet blir tildelt ved hjelp av det "nye" nøkkelordet fordi det fører til tildeling av tildeling i minnet. Feilen vises som viser at det ikke er noe eksisterende minne for å tildele dataene.

Oppgaver som konsumerer RAM i bedtools: Denne feilen kan oppstå i sengestudier. Denne feilen oppstår som viser at det meste av RAM -en konsumeres av oppgaven du utfører.

Korrupsjon av minne: Den mangelfulle koden fører til denne typen feil. Koderen må sørge for at han har skrevet riktig kode. Noen ganger blir det sarkastisk mens du tar en innspill fra brukeren og deretter bruker det "nye" nøkkelordet for å tildele minnet på samlingenelsestidspunktet. Noen ganger gjør det det feil fordi det nye nøkkelordet forventer at riktig verdi blir gitt til det. Hvis vi prøver å passere en feil inngang, forårsaker det BAD_alloc -feilen.

Syntaks:

Det er en feiltidsfeil. Den har ingen syntaks. Slik ser det ut i det følgende:

Feil: Avslutt kalt etter å ha kastet en forekomst av 'STD :: Bad_alloc'

Hvor 'std :: bad_alloc' indikerer objektet som kastes av tildelingsfunksjonen som et unntak som viser svikt i tildelingen i minnet.

Eksempel:

La oss implementere et eksempel der vi tar verdiene fra brukeren om studenter. Etter å ha lagret dem i en minnehauge, viser vi dem deretter med en for loop. Først inkluderer vi “iostream”, “String” og “CSTDLIB” -tekstfilene. "Iostream" brukes til å utføre I/O -operasjonene som Cin, Cout, etc. En strengoverskriftsfil brukes til å fungere med strenghåndtering. Og "CSTDLIB" -biblioteket er en samling av funksjoner som kan hjelpe i noen matematiske funksjoner. Konvertering av en datatype gjøres ved hjelp av den definerte funksjonen.

Etter det oppretter vi to matriser - “stud_id []” i størrelse tre som lagrer IDen til studenten og “makrs []” av størrelse 5 som stammer merkene til studentene. Deretter brukes en heltallvariabel for å få tilgang til verdiene som brukes til loopen. Deretter en ekstra strengvariabel "id" som vi tildeler verdien av "stud_id" og lagrer den i minnet. Deretter ved å bruke for -loopen som starter fra 0 til 3, tar den IDen fra brukeren.

Nå tildeler vi ID, et minne som bruker "temp" -variabelen. Etter det kopierer vi temp -verdien til “ID”. Deretter bruker vi "substr ()" -funksjonen til lengden på ID -en som er lagret i "ID". Etter det tildeler vi “Marks [k]” “atoi (temp)” som konverterer strengen til heltallnummeret og tildeler den til merkene [] -arrayen. Deretter, utenfor løkken, bruker vi for -loopen igjen. Vi får verdiene og viser dem som en utgang. Vi utfører koden ved å returnere nullverdien.

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

char stud_id [3]; int merker [5];
int k;
streng -ID;
for (k = 0; k <= 3; k++)

cout<< "Kindly enter an ID:";
cin >> id;
char* temp = ny røye [id.størrelse ()+1]; id.Kopier (temp, id.størrelse () + 1);
stud_id [k] = id [0]; temp = ny char [id.størrelse ()-2];
Id = id.substr (2, id.lengde());
Id.Kopier (temp, id.størrelse () + 1);
merker [k] = atoi (temp);

cout << endl;
cout << "Name" << " "<< "Average" << endl;
for (k = 0; k <= 5; k++)
cout << stud_id[k] <<" "<< marks[k] << endl;

retur 0;

Etter utførelsen viser den ikke feilen først mens vi prøver å gi de brukerdefinerte verdiene til den, og kaster feilen som vises i det følgende. Når vi ser denne feilen, kan vi ikke identifisere årsaken til feilen. Nå fikser vi koden vår som kan forhindre at vi har minnetildelingsfeil.

Følgende kode er den feilfrie koden der vi fjerner den unødvendige delen som forårsaker RAM-forbruk. Vi lemmatiserer merkene [] matrisen til indeksen 3 som går ut av bundet i forrige kode. Hvor i løkken bruker vi “<” less-than sign instead of less-than-or-equal-to “<=” in both loops. This prevent the compiler from moving out of bounds. We remove the “temp” string variable because we don't need it anymore. Then, we remove the line of code in which we are trying to limit the size of the “Id” variable to less than “2”. It causes the new keyword to be incorrect. After removing all unnecessary code, we re-execute the code.

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

char stud_id [3];
int merker [3];
int k;
for (int k = 0; k < 3; k++)
cout<< "Kindly enter an ID:";
cin >> stud_id;
cin >> merker [k];

cout << endl;
for (k = 0; k < 3; k++)
cout << stud_id[k] <<" "<< marks[k] << endl;

retur 0;

I forrige kode gjorde vi noen endringer i den for å forhindre "STD :: Bad_alloc" -feilen. Etter utførelsen vises utgangen i det følgende. Den ber brukeren om å legge inn IDen tre ganger på slutten. ID og gjennomsnittlig beregning vises. Denne gangen spiller det ingen rolle hvilken verdi vi gir den; Vi kan prøve å legge til hvilken som helst ønsket verdi, slik at det ikke vil vise noen feil.

Konklusjon

I denne guiden studerte vi en feil som kan oppstå på grunn av svikt i minnetildeling. Det er fordi noen ganger blir de ugyldige objektene overført til det, eller noen ganger mens vi skriver koden, bruker vi unødvendig minnetildeling som ikke er nødvendig og kan forårsake forbruk av RAM som fører til "'STD :: Bad_alloc'" -feil. Det er vanskelig å forstå denne feilen fordi vi må lese hele koden for å sjekke hvor feilen oppstår. Vi forklarte hvordan vi kan oppdage disse feilene og hvordan de vil bli løst. Vi håper at dette kan veilede deg i å fikse denne typen problemer.