Błąd C ++ zakończony porzuceniem instancji „STDBAD_ALLOC”

Błąd C ++ zakończony porzuceniem instancji „STDBAD_ALLOC”

Ponieważ znamy błędy, które mogą wystąpić w naszym kodzie z jakiegoś powodu, niezależnie od tego, czy jest to błąd popełniony przez kodera, problemy z wersją, czy też inne powody, może to istnieć z powodu błędów. Istnieją trzy rodzaje błędów. Niektóre z nich są logiczne, podczas gdy niektóre są składni lub kompilacji błędy czasu. Dzisiaj omówimy błąd, który może wystąpić z powodu niektórych problemów związanych z pamięcią. Tego rodzaju problemy są czasami gorączkowymi zadaniami do rozwiązania. Ale dzisiaj omówimy je krótko, aby rozwiązać te błędy. Błąd, którego się nauczymy, brzmi „zakończenie wywołane po rzuceniu instancji„ std :: BAD_ALLOC ””. Ten błąd jest związany z pamięcią. Taki błąd może wystąpić w wyniku następujących:

Awaria alokacji w pamięci: Może to wystąpić z powodu przydzielania dużych części pamięci przy użyciu „nowego” słowa kluczowego, ponieważ prowadzi do awarii alokacji w pamięci. Wyświetlany jest błąd, który pokazuje, że nie ma pamięci do przydzielenia danych.

Zadania konsumujące pamięć RAM w bedtools: Ten błąd może wystąpić w bedtools. Występuje ten błąd, który pokazuje, że większość pamięci RAM jest konsumowana przez wykonane zadanie.

Zepsucie pamięci: Wadliwy kod prowadzi do tego rodzaju błędu. Koder musi upewnić się, że napisał właściwy kod. Czasami staje się sarkastyczny podczas przyjmowania danych wejściowych od użytkownika, a następnie używając „nowego” słowa kluczowego do przydzielenia pamięci w momencie kompilacji. Czasami sprawia, że ​​jest to nieprawidłowe, ponieważ nowe słowo kluczowe spodziewa się, że właściwą wartość zostanie przekazana. Jeśli spróbujemy przekazać nieprawidłowe dane wejściowe, powoduje to błąd BAD_ALLOC.

Składnia:

Jest to błąd w czasie kompilacji. Nie ma żadnej składni. Oto, jak to wygląda w następujący sposób:

Błąd: zakończ wywołany po rzuceniu instancji „std :: Bad_Alloc”

Gdzie „std :: BAD_ALLOC” Wskazuje obiekt rzucany przez funkcję alokacji jako wyjątek, który pokazuje awarię alokacji w pamięci.

Przykład:

Wdrożyćmy przykład, w którym bierzemy wartości od użytkownika na temat studentów. Następnie, po przechowywaniu ich w stosie pamięci, wyświetlamy je za pomocą pętli dla. Najpierw dołączamy pliki „iostream”, „ciąg” i pliki nagłówka „cstdlib”. „Iostream” służy do wykonywania operacji we/wy, takich jak CIN, Cout itp. Plik nagłówka sznurka służy do działania z obsługą łańcucha. A biblioteka „CSTDLIB” to zbiór funkcji, które mogą pomóc w niektórych funkcjach matematycznych. Konwersja danych odbywa się za pomocą zdefiniowanej funkcji.

Następnie tworzymy dwie tablice - „stad_id []” z rozmiaru trzecie. Następnie do dostępu do wartości używanych do pętli używana jest zmienna liczb całkowita. Następnie dodatkowa zmienna łańcuchowa „id”, do której przypisujemy wartość „stad_id” i przechowujemy ją w pamięci. Następnie, używając pętli, która zaczyna się od 0 do 3, pobiera identyfikator od użytkownika.

Teraz przydzielamy identyfikator, pamięć, która wykorzystuje zmienną „Temp”. Następnie kopiujemy wartość tymczasową do „id”. Następnie używamy funkcji „substr ()” do długości identyfikatora przechowywanego w „id”. Następnie przypisujemy „znaki [k]” „ATOI (TEMP)”, który przekształca ciąg w numer liczby całkowitej i przypisuje go do tablicy znaków []. Następnie, poza pętlą, ponownie używamy pętli dla. Otrzymujemy wartości i wyświetlamy je jako wyjście. Wykonujemy kod, zwracając wartość NULL.

#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

Char Stud_id [3]; int Marks [5];
int k;
identyfikator ciągu;
dla (k = 0; k <= 3; k++)

Cout<< "Kindly enter an ID:";
cin >> id;
char* temp = new char [identyfikator.size ()+1]; id.Kopia (temp, identyfikator.size () + 1);
stad_id [k] = id [0]; temp = new char [identyfikator.size ()-2];
Id = id.substr (2, id.długość());
ID.Kopia (temp, identyfikator.size () + 1);
Znaki [k] = atoi (temp);

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

powrót 0;

Po wykonaniu nie wyświetla najpierw błędu, gdy próbujemy przekazać mu wartości zdefiniowane przez użytkownika, rzucając błąd, który jest pokazany następująco. Widząc ten błąd, nie możemy zidentyfikować przyczyny błędu. Teraz naprawiamy nasz kod, który może uniemożliwić nam błędy alokacji pamięci.

Poniższy kod to kod bez błędów, w którym usuwamy niepotrzebną część, która powoduje zużycie pamięci RAM. Lemmatyzujemy tablicę znaków [] do indeksu 3, który jest poza zasięgiem w poprzednim kodzie. Gdzie w pętli używamy „<” 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.

#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

Char Stud_id [3];
INT Marks [3];
int k;
dla (int k = 0; k < 3; k++)
Cout<< "Kindly enter an ID:";
cin >> stad_id;
cin >> znaki [k];

Cout << endl;
dla (k = 0; k < 3; k++)
Cout << stud_id[k] <<" "<< marks[k] << endl;

powrót 0;

W poprzednim kodzie wprowadziliśmy w nim pewne zmiany, aby zapobiec błędowi „std :: BAD_ALLOC”. Po wykonaniu wyjście jest wyświetlane następująco. Prosi użytkownika o wprowadzenie identyfikatora trzykrotnie na końcu. ID i średnie obliczenia są wyświetlane. Tym razem nie ma znaczenia, jaką wartość do niej przekazujemy; Możemy spróbować dodać dowolną pożądaną wartość, więc nie wyświetli żadnego błędu.

Wniosek

W tym przewodniku zbadaliśmy błąd, który może wystąpić z powodu niepowodzenia alokacji pamięci. Dzieje się tak, ponieważ czasami niepoprawne obiekty są do niego przekazywane lub czasami podczas pisania kodu, używamy niepotrzebnej alokacji pamięci, która nie jest potrzebna i może powodować zużycie pamięci RAM, który prowadzi do błędu „std :: Bad_Alloc” ”. Trudno zrozumieć ten błąd, ponieważ musimy odczytać cały kod, aby sprawdzić, gdzie występuje błąd. Wyjaśniliśmy, jak wykryć te błędy i jak zostaną rozwiązane. Mamy nadzieję, że może to poprowadzić Cię do rozwiązania tego rodzaju problemu.