Jeśli używasz GCC można użyć flagi -Weffc++
, który generuje ostrzeżenia, gdy zmienna nie jest inicjowany na liście członek inicjalizacji. To:
class Foo
{
int v;
Foo() {}
};
prowadzi do:
$ g++ -c -Weffc++ foo.cpp -o foo.o
foo.cpp: In constructor ‘Foo::Foo()’:
foo.cpp:4: warning: ‘Foo::v’ should be initialized in the member initialization list
Jednym minusem jest to, że -Weffc++
będzie również ostrzegać, gdy zmienna ma odpowiedniego inicjalizacji domyślnego konstruktora i tym samym nie byłoby konieczne. Ostrzeże Cię również, gdy zainicjujesz zmienną w konstruktorze, ale nie na liście inicjalizacji członków. I ostrzega o wielu innych problemach w stylu C++, takich jak brak konstruktorów kopiowania, więc może być konieczne oczyszczenie kodu nieco, gdy chcesz regularnie używać -Weffc++
.
Istnieje również błąd, który powoduje, że zawsze daje ostrzeżenie przy użyciu anonimowych związki, które obecnie nie mogą obejść inne następnie przejście ostrzeżenie, co można zrobić z off:
#pragma GCC diagnostic ignored "-Weffc++"
Ogólnie jednak znalazłem -Weffc++
, aby był niesamowicie przydatny w łapaniu wielu typowych błędów w C++.
Dobry artykuł "W poszukiwaniu niezainicjowanych członków klasy" - http://www.viva64.com/en/b/0354/ –
W przypadku korzystania z kompilatora clang można wypróbować dezynfekcję pamięci: http: //clang.llvm .org/docs/MemorySanitizer.html. Wykonuje dynamiczne sprawdzanie i ma znacznie mniejszy narzut w porównaniu do valgrind. Jest ładna prezentacja od autora na cppcon2014 https://www.youtube.com/watch?v=V2_80g0eOMc – Jurasic