28 июня 2006
ATL::CWindow
21 июня 2006
Coding Standards: Smart pointers
Интеллектуальные указатели
Любое использование ресурсов должно следовать принципу «Resource Acquisition Is Initialization».
Таким образом, любое выделение памяти через new должно инициализировать умный указатель:char *Node = new char[Size];
scoped_array<char> Buffer( new char[Size] );
Это правило относится к любым ресурсам, не только в динамической памяти. Например, если необходимо воспользоваться функциями WinAPI для работы с файлами CreateFile() и CloseFile() необходимо написать класс «оболочку» над этими функциями, который в деструкторе будет закрывать файл. Можно использовать любые классы их используемых библиотек: Обычные указатели можно использовать только в случае когда выполняются все перечисленные условия:XMLNode* CreateNode(CFile File) { return new XMLNode(File); }
auto_ptr<XMLNode> CreateNode(CFile File) { return new XMLNode(File); }
− Standard C++ Library (auto_ptr, fstream, ...)
− boost (shared_ptr, scoped_ptr, ...)
− WTL (CDC, CClientDC, CFont, ...)
− указатель не владеет объектом;
− точно известно, что время жизни объекта, на который ссылается указатель, больше чем время жизни указателя.
12 июня 2006
Указатели
char *Text = new char[TextLength];
Почувствуйте разницу:
boost::scoped_array<char> Text(new char [TextLength]);