Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

nullptr C++11 i bezpieczeństwo z tym związane

Ostatnio zmodyfikowano 2017-01-17 15:30
Autor Wiadomość
Nazgul
Temat założony przez niniejszego użytkownika
nullptr C++11 i bezpieczeństwo z tym związane
» 2017-01-17 13:41:33
Chciałbym się spytać o bezpieczeństwo związane z użyciem nullptr

tzn:
co faktycznie oznacza użycie tego w podanej sytuacji i czy można bezpiecznie pisać w taki sposób:

1:
C/C++
void foo( int * value )
{
    int * p = new int( 1 );
    value = p;
}

int main()
{
    foo( nullptr ); //
    return 1;
}

czy jednak lepiej używać zapisu
C/C++
void foo( int * value )
{
    if( value == nullptr ) return; //// dopisana linijka
   
    int * p = new int( 1 );
    value = p;
}

int main()
{
    foo( nullptr ); //
    return 1;
}
P-156536
j23
» 2017-01-17 14:02:28
Ta funkcja jest źle napisana, ma wyciek pamięci.

Zapewne o to Ci chodziło:
C/C++
void foo( int ** value )
{
    if( value == nullptr ) return;
   
    int * p = new int( 1 );
    * value = p;
}
P-156537
Nazgul
Temat założony przez niniejszego użytkownika
» 2017-01-17 14:05:31
Dodatkowo podam inną sytuację, żeby nikt nie skupił się zbytnio na wycieku pamięci z powodu tego 'new' ;) :

C/C++
class klasa {
public:
    static void foo( int * value ) {
        value = & p;
    }
private:
    static int p;
};

int klasa::p = 1;

int main()
{
    klasa::foo( nullptr );
   
    return 1;
}
P-156539
DejaVu
» 2017-01-17 14:19:52
nullptr to nic innego jak ustandaryzowana stała NULL. Ma ona zalety dla kompilatora, ponieważ może on rzucić dodatkowym warningiem. nullptr nie rozwiązuje żadnych problemów bezpieczeństwa ani czegokolwiek innego. To po prostu inny zapis, który jest aktualnie rekomendowany, ponieważ jest znacznie bardziej przyjazny kompilatorowi. Wartości nullptr nie przypiszesz do int-a, a NULL już tak. Widząc nullptr na 100% wiesz, że dotyczy to wskaźnika. NULL może być przypisany do każdego typu podstawowego.
P-156541
j23
» 2017-01-17 14:25:30
@Nazgul, ale ten drugi kod niewiele zmienia. Sprawdzanie, czy value (nie)jest nullptr, nie ma znaczenia, bo i tak nadpisujesz wartość tego wskaźnika.
P-156542
mokrowski
» 2017-01-17 14:28:18
nullptr jak pisał @DejaVu, nie ma rozwiązywać problemów operowania na wskaźnikach. Trochę tych problemów rozwiązuje referencja. Zdefiniowany jest typ nullptr_t który umożliwia np. polimorficzne specyfikowanie funkcji lub metod pracujących na wskaźniku. Dodatkowo dostępna jest biblioteka guideline support library która zawiera np. sprawdzenie not_null https://github.com/isocpp​/CppCoreGuidelines/blob/master​/CppCoreGuidelines.md#S-gsl (cały dokument jest dość istotny).
Wskaźniki są i będą potencjalnie niebezpieczne i niestety trzeba się z tym pogodzić :-/ (albo użyć GSL'a a będzie nieco lepiej :-) ).
P-156543
Nazgul
Temat założony przez niniejszego użytkownika
» 2017-01-17 15:30:52
Sorry Panowie, bardzo dziękuję za pomoc, teraz mi kompilator krzyczy i piszczy, faktycznie coś mi się dziwnego urodziło w głowie.. Robię trochę większy projekt, za bardzo nie ma możliwości żeby sprawdzić poprawności projektu w tym momencie, a okazało się, że jak włączyłem program testowy to w ogóle zapomniałem o co mi wcześniej chodziło
ahh te wskaźniki, czasem się myśli, że się je opanowało, a one tylko czekają...;)
jeszcze raz dziękuję za pomoc i za nadesłane materiały :D

P.S. Tak j23, Twój kod w zupełności przedstawia o co mi chodziło, tylko minimalna różnica
C/C++
void foo( int * value )
{
    int p = 1;
    * value = p;
}
teraz jak przypisuję nullptr to od razu mi kompilator nawala informacjami, że wskaźnik jest nullptr i że się nie da(dlatego już wiem że trzeba dodać..)
C/C++
if( value == nullptr ) return;

;P dzięki wielkie
P-156548
« 1 »
  Strona 1 z 1