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: void foo( int * value ) { int * p = new int( 1 ); value = p; }
int main() { foo( nullptr ); return 1; }
czy jednak lepiej używać zapisu void foo( int * value ) { if( value == nullptr ) return; int * p = new int( 1 ); value = p; }
int main() { foo( nullptr ); return 1; }
|
|
j23 |
» 2017-01-17 14:02:28 Ta funkcja jest źle napisana, ma wyciek pamięci. Zapewne o to Ci chodziło: void foo( int ** value ) { if( value == nullptr ) return; int * p = new int( 1 ); * value = p; }
|
|
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' ;) : 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; }
|
|
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. |
|
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. |
|
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 :-) ). |
|
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 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ć..) if( value == nullptr ) return;
;P dzięki wielkie |
|
« 1 » |