W kilku starszych projektach kodu, kiedy nigdy nie słyszałem o inteligentnych wskaźnikach, zawsze gdy potrzebowałem sprawdzenia, czy wskaźnik nadal wskazywał na prawidłowy obiekt, zawsze robiłem coś takiego ...Nullptr i sprawdzanie, czy wskaźnik wskazuje na poprawny obiekt
object * meh = new object;
if(meh)
meh->member;
Albo kiedy potrzebne, aby usunąć obiekt bezpiecznie, coś jak ten
if(meh)
{
delete meh;
meh = 0;
}
Cóż, teraz nauczyłem się o problemach, które mogą wyniknąć z wykorzystaniem obiektów i wskaźniki w wyrażeniach boolowskich, zarówno z liczbami dosłownymi, w sposób trudny:. A teraz dowiedziałem się również o niezbyt nowej, ale całkiem fajnej funkcji słowa kluczowego C++, nullptr
. Ale teraz jestem ciekawy.
Ja już przeszedł i poprawione większość mojego kodu tak, że na przykład, gdy usuwanie obiektów mam teraz napisać
if(meh)
{
delete meh;
meh = nullptr;
}
Teraz zastanawiam o wartości logicznej. Po przejechaniu tylko powiedzieć, int w instrukcji if jak ta,
int meh;
if(meh)
Potem niejawnie sprawdza zera bez potrzeby dodawania go napisać.
if(meh == 0) // does the exact same check
Teraz, czy C++ zrobi to samo dla wskaźników? Jeśli przekazać znak tak jak w instrukcji if?
char * meh;
if(meh)
Następnie domyślnie porównać go z nullptr? Ze względu na to, jak długo pisałem te wyrażenia, takie jest to, że w tej chwili należy sprawdzić, czy wskaźniki są poprawne przed użyciem, wpisując, jeśli (obiekt *), a następnie wywołując jego członków. Jeśli nie jest to funkcja, dlaczego nie? Zbyt trudne do wdrożenia? Rozwiązałbym niektóre problemy, usuwając kolejny mały sposób na zepsucie kodu.
Nie musisz ** nie ** potrzebować sprawdzać wskaźników przed 'delete'ing. Całkowicie bezpieczne jest "usuwanie" 'nullptr'. –
W twoim ostatnim przykładzie, masz na myśli 'char * meh = nullptr; jeśli (meh) '? Wskaźnik jest niezainicjowany. –
Wynik twojego "nowego" wyrażenia nigdy nie będzie mieć wartości null, zamiast tego używane są wyjątki. Jak wspomniano, usunięcie null jest w porządku, to nic nie robi. Zasadniczo lepiej nie resetować wartości wskaźników do wartości null. Ostatni raz, gdy jest używany, powinien być ostatnim razem, gdy nie jest pusty, więc dostęp do usuniętego wskaźnika powinien być uważany za błąd; ustawienie go na wartość null to ukrywa. – GManNickG