Błąd podwójny wolny lub zepsucie

Błąd podwójny wolny lub zepsucie
Błąd podwójnej wolnej lub korupcji w C ++ oznacza, że ​​nasz program w jakiś sposób wywołuje obiekt Free () C ++ ze zmienną nielegalną wskaźnikiem. Kiedy używamy inteligentnych wskazówek, takich jak shared_ptr, musimy sprawdzić, ponieważ jeśli wywołamy funkcję get (), używamy bezpośrednio surowego wskaźnika. Planujemy przypisać to do inteligentnego wskaźnika w celu dalszego odniesienia. To zepsucie jest podstawową przyczyną awarii kodu. Używamy funkcji Free () do przesyłania pamięci sterty zwykle. Pamięć sterta wykorzystała głównie funkcję naszego systemu operacyjnego do zarządzania lokalizacjami pamięci. Oto błąd, gdy nasz kod nie jest właścicielem tego wskaźnika, dopóki nie skopiujemy kodu.

Kiedy wskaźnik jest zerowy:

Tutaj po prostu pokazujemy naszą funkcję Free (), jak to działa na początku; Uwzględniamy biblioteki i standardy przestrzeni nazw oraz uruchamiamy główny organ kodu zainicjowany zmienna liczb całkowity. Następnie używamy instrukcji IF-ELSE, aby sprawdzić wskaźnik zerowy i wskaźnik, który ma naszą wartość liczbową. Po warunkach wywołujemy naszą funkcję, aby zregenerować nasz wskaźnik.

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

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

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

w przeciwnym razie

Cout << "Pointer is Null" << endl;

darmowe (ptr1);
Cout << *ptr2;

Po wykonaniu wyjście będzie wyglądało tak:

Jak to jest naliczone:

Jest to naliczone, jeśli wskaźnik używa alokacji pamięci lub czasami wywołuje funkcję free () w C ++. Można go również naliczyć, gdy Free () jest wywoływany jako argument do tej samej lokalizacji pamięci jeden lub więcej niż jeden raz. Struktura danych zarządzania pamięcią kodu została uszkodzona lub nie może pozwolić podejrzanemu użytkownikowi końcowi wprowadzić wartości w losowej lokalizacji pamięci. Jeśli kod wywołuje funkcję Free () z tą samą lokalizacją pamięci więcej niż raz.

Ponadto, jeśli dwa razy usuniemy ten sam wpis i usuniemy coś, co nie zostało przydzielone na stercie pamięci. Zatem wskaźniki są bezpośrednią przyczyną tego błędu.

#włączać
#włączać
#włączać
int main ()
STD :: wektor vec 0, 1, 2;
STD :: wektor:: iterator it = std :: max_element (vec.początek (), VEC.koniec());
STD :: wektor VEC2 3, 4, 5;
VEC.Wstaw (VEC.end (), VEC2.początek (), VEC2.koniec());
VEC.usunąć (it);
dla (auto & n: vec)
STD :: Cout << n << std::endl;

Najpierw integrujemy trzy biblioteki nagłówka; Jednym z nich jest #include, w standardowej bibliotece szablonów, jest to klasa szablonów w języku programowania. Jest to pojemnik sekwencyjny, który zapisuje elementy. Głównie używane do obsługi danych dynamicznych w języku programowania C ++. Możemy rozszerzyć wektory, ale zależy to od elementów, które zawierają te wektory wraz z nimi.
Drugi plik nagłówka to #include, który zapewnia nam wiele funkcji, które mogą być dla wielu celów, takie jak sortowanie elementu, wspieranie algorytmu wyszukiwania, pomnożenie wartości, zmienne zliczające i tak dalej. Wreszcie, to znaczy #include ten cel jest obsługą naszego strumienia wejściowego. Po bibliotekach rozpoczynamy nasze główne ciało, w których używamy standardów z wektorami i przypisujemy zmienne o typu danych całkowitych i przypisujemy wartości do tej zmiennej.

Oto nasze stwierdzenie, w którym przypisujemy naszą zmienną wraz z jej punktem początkowym i końcowym za pośrednictwem funkcji Maz_Element. Ponownie powtórz stwierdzenie, ale tym razem zmieniamy nasze wartości na inną zmienną. Następnie używamy funkcji wstawienia i przekazujemy parametry, które są punktem końcowym naszej poprzedniej zmiennej, punktu początkowego 2. zmiennej i punktu końcowego zmiennej. Funkcja Erase () służy do usuwania pojedynczego elementu z wektora i służy również do modyfikacji wielkości wektora. W końcu używamy do pętli z limitem naszej pierwszej zmiennej, aw pętli wyświetlamy zmienną, którą zainicjowaliśmy w naszej pętli.

Jak ominąć:

Możemy uniknąć tego rodzaju podatności; Zawsze musimy przypisać Null do naszego wskaźnika, gdy staje się wolny. Następnie głównie menedżerowie sterty zignorowali bezpłatne wskaźniki zerowe. Jest to najlepsza praktyka, w której zerwamy wszystkie usunięte wskaźniki, a także musimy również ustawić sprawdzenie, czy wskaźnik jest zerowy, czy nie, zanim uwolnimy wskaźnik. Musimy zainicjować null wskaźnika na początku naszego kodu. Jak kiedy próbujemy użyć instrukcji Cout (std :: cout).

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

int * i = new int ();
Usuń i;
Cout<Cout<<"\npointer delete successfully";
Usuń i;
Cout<powrót 0;

Plik nagłówka jest uwzględniony. Następnie piszemy przy użyciu standardu przestrzeni nazw i rozpoczynamy ciało głównego programu. Zainicjowaliśmy wskaźnik z typem danych liczb całkowitych. Tutaj przypisujemy Null do wskaźnika i drukujemy wskaźnik. Po przypisaniu NULL usuwamy wskaźnik i drukujemy przesłanie sukcesu. W końcu ponownie sprawdzamy nasz wskaźnik i widać, że w naszej stercie pamięci nie ma wskaźnika.

Wniosek:

W tym artykule krótko opisujemy błąd podwójnie wolny lub zepsucia. Następnie przenieśliśmy naszą pamięć za pomocą naszej funkcji () i omówiliśmy przyczyny błędu i użyliśmy przykładu funkcji wymazania (). Ostatecznie zapewniliśmy rozwiązanie proste i logiczne rozwiązanie tego błędu w bardzo łatwy sposób.