Если вы используете GCC вы можете использовать -Weffc++
флаг, который генерирует предупреждения, когда переменная не инициализируется в списке элемент инициализации. Это:
class Foo
{
int v;
Foo() {}
};
ведет к:
$ 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
Одним из недостатков является то, что -Weffc++
также предупредит вас, когда переменная имеет правильный конструктор по умолчанию и инициализацию таким образом, не будет необходимости. Он также предупредит вас, когда вы инициализируете переменную в конструкторе, но не в списке инициализации члена. И он предупреждает о многих других проблемах стиля C++, таких как отсутствующие конструкторы-копии, поэтому вам может понадобиться немного очистить свой код, если вы хотите регулярно использовать -Weffc++
.
Существует также ошибка, которая заставляет его всегда дать вам предупреждение при использовании анонимных союзов, которые вы в настоящее время не могут работать вокруг другого, то выключая предупреждение, которое может быть сделано с:
#pragma GCC diagnostic ignored "-Weffc++"
В целом, однако я нашел -Weffc++
, чтобы быть невероятно полезным в ловле множества распространенных ошибок C++.
Хорошая статья «В поисках неинициализированных членов класса» - http://www.viva64.com/ru/b/0354/ – 2015-10-29 14:38:18
В случае использования компилятора clang вы можете попробовать дезинфицирующее средство для хранения данных: http: //clang.llvm .org/документы/MemorySanitizer.html. Он выполняет динамическую проверку и имеет значительно меньшие накладные расходы по сравнению с valgrind. Существует хорошая презентация от автора на cppcon2014 https://www.youtube.com/watch?v=V2_80g0eOMc – Jurasic