Хорошо, хорошая практика кодирования становится хорошим программированием привычки , и тогда для их использования требуется очень мало "внимания". Я бы предложил использовать объекты-оболочки RAII, такие как std :: unique_ptr, std :: shared_ptr, наряду с четкими рекомендациями о том, когда и где следует использовать динамическое размещение.
Хорошее начало: если вы видите, что кто-то печатает слово delete
, то это должен быть флаг, с которым вам нужно быть очень осторожным.
Это подводит меня ко второму пункту: не используйте динамическое размещение (если это абсолютно необходимо), используйте как можно больше автоматически уничтожаемых объектов, контролируемых областью действия. НИКОГДА new
объект RAII, и это заставит вас задуматься о том, как следует обрабатывать объект, который переносит владелец RAII, если изменяется область действия.
Например:
std::auto_ptr<Foo> ptr2Foo( new Foo() );
...
...
if(ptr2Foo->isValidNow())
passToOwningObject(otherObject, ptr2Foo);
//now when scope ends the newed Foo will be destroyed or owned
//by an appropriate object.
или
std::unique_ptr<Foo> ptr2Foo( new Foo() );
...
...
if(ptr2Foo->isValidNow())
passToOwningObject(otherObject, std::move(ptr2Foo));
//now when scope ends the newed Foo will be destroyed or owned
//by an appropriate object.
И регулярно запускать анализ кода (MSVC, Valgrind, Coverity и т. Д.) И не игнорировать предупреждения компилятора.