SlideShare a Scribd company logo
C++ без new и delete 
Матросов Михаил 
mikhail.matrosov@gmail.com 
Russian C++ User Group, Саратов, 2014
Вместо содержания 
• Что? 
– Писать код без new и delete в современном С++ 
• Как? 
– Контейнеры STL 
– std::make_shared, std::make_unique 
– Cвои обёртки для своих умных указателей 
• Почему? 
– new и delete увеличивают сложность кода 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
2
Современный С++ 
• Современный С++ включает 
– Возможности стандарта С++14 
– Современные best practices 
• C++14 is done! 
– Рабочий черновик стандарта ISO/IEC 
14882:2014(E) единогласно одобрен 
– Полностью или частично поддерживается 
всеми мажорными компиляторами 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
3
Что и как? 
Общие рекомендации 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
4
Объекты в С 
typedef struct ObjectTag 
{ 
// Object members 
} Object; 
int InitObject(Object* io_pObject); 
int UseObject(Object* io_pObject); 
int ClearObject(Object* io_pObject); 
void ObjectsInC() 
{ 
Object* pObject; 
pObject = malloc(sizeof(Object)); // Allocate memory 
InitObject(pObject); // Establish invariants and acquire resources 
UseObject(pObject); // Do the work 
ClearObject(pObject); // Release resources 
free(pObject); // Release memory 
// By the way: error handling :-/ 
} 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
5
Объекты в С++ 
• Инкапсуляция: 
– Конструкторы 
– Деструкторы 
– Методы 
class Object 
{ 
// Object members 
public: 
Object(); // Establish invariants and acquire resources 
~Object(); // Release resources 
void Use(); // Do the work 
}; 
• Обработка ошибок: 
– Исключения 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
6
Объекты в С++ 
• 2 лучше, чем 1 
– управление ресурсами 
// 1. Naive C++ style 
Object* p = new Object(); // Allocate memory 
p->Use(); // Do the work 
delete p; // Release memory 
• 3 лучше, чем 2 
– unique_ptr делает всё, что и 
auto_ptr, только лучше 
• 4 лучше, чем 3 
– основная тема доклада 
// 2. More secure C++98 with RAII 
std::auto_ptr<Object> ap(new Object()); // Allocate memory 
ap->Use(); // Do the work 
// 3. More secure C++11 with RAII 
std::unique_ptr<Object> up(new Object()); // Allocate memory 
up->Use(); // Do the work 
// 4. New bullet-proof modern C++ 
auto up2 = std::make_unique<Object>(); // Create unique object 
up2->Use(); // Do the work 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
7
Разделяемые объекты в С++ 
void UseObject(Object*); // Shall retain the object 
void AcceptObject(Object*); // Shall delete the object 
void ShareObject(std::shared_ptr<Object>); // Both cases 
// Naive C++ 
Object* p = new Object(); 
p->Use(); 
UseObject(p); // Want to use object after call 
p->Use(); 
AcceptObject(p); // No longer need the object 
// C++98 & RAII 
/* No way to say this! */ 
// Modern C++ 
auto sp = std::make_shared<Object>(); 
sp->Use(); 
ShareObject(sp); // Want to use object after call 
sp->Use(); 
ShareObject(std::move(sp)); // No longer need the object 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
8
Объекты со счётчиком ссылок в С++ 
// Naive C++ (not used) 
RefCounted* p = new RefCounted(); 
p->AddRef(); 
p->Use(); 
p->Release(); 
// C++98 & RAII 
RefPtr<RefCounted> rp = new RefCounted(); 
rp->Use(); 
// Modern C++ 
auto rp2 = MakeRefPtr<RefCounted>(); 
rp2->Use(); 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
9
Динамические массивы в С++ 
void UseArray(int*); 
int n = 100; 
// Naive C++ 
int* p = new int[n]; 
UseArray(p); 
delete[] p; 
// C++98 & RAII 
std::vector<int> v(n); 
UseArray(&v[0]); 
// Modern C++ 
std::vector<int> v2(n); 
UseArray(v2.data()); 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
10
Почему? 
Аргументация 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
11
Лучше == проще 
• Немного авторитета: 
– Главный технический императив разработки ПО – 
управление сложностью [McConnel2004] 
– Make Simple Tasks Simple! [Stroustrup2014] 
– ≈99.9998% разработчиков – не эксперты [Sutter2014] 
– Принцип KISS (Keep It Simple, Stupid) 
• Что значит проще? 
– Простые задачи должны решаться просто 
– Сложные – не сложнее, чем необходимо 
– Сначала – простота, затем – производительность 
• Как сделать проще? 
– Принцип DRY (Don’t Repeat Yourself) 
– Принцип «по умолчанию» [Sutter2014] 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
12
Принцип «по умолчанию» 
• Основная мысль: 
– Известная задача ⇒ известное решение 
• Преимущества: 
– Взаимопонимание с другими разработчиками 
– Уменьшение порога входа для новичков 
– Меньше думать – продуктивная лень  
– Все те же, что и для правил кодирования 
• “A tour of C++” [Stroustrup2013] 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
13
std::make_unique<T>() vs. 
std::unique_ptr(new T) 
int GenerateId(); 
std::pair<std::unique_ptr<Object>, int> MakeObjectWithIdWrong() 
{ 
return std::make_pair( 
std::unique_ptr<Object>(new Object()), 
GenerateId()); 
} 
std::pair<std::unique_ptr<Object>, int> MakeObjectWithIdRight() 
{ 
return std::make_pair( 
std::make_unique<Object>(), // Safe 
GenerateId()); 
} 
Дублирование 
имени типа. DRY! 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
14 
// May throw 
// May leak!
std::make_shared<T>() vs. 
std::shared_ptr(new T) 
std::shared_ptr<Object> sp(new Object()); 
counter 
Object 
sp 
Два выделения 
памяти 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
15
std::make_shared<T>() vs. 
std::shared_ptr(new T) 
auto sp = std::make_shared<Object>(); 
Одно выделение памяти. 
Оптимизация We Know Where 
You Live [Lavavej2012]. 
counter Object 
sp 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
16
std::make_shared и std::make_unique 
• Плюсы обоих: 
– Безопасность при исключениях 
– Нет дублирования имени типа 
• Плюсы std::make_shared: 
– Одно обращение к менеджеру памяти 
• Минусы есть, но несущественные: 
– Нет формы для указания собственного аллокатора для std::unique_ptr 
(для std::shared_ptr это std::allocated_shared) 
– Опасность false sharing объекта и счётчика ссылок 
[см. вопрос на StackOverflow] 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
17
Обобщаем 
• delete по умолчанию не используется со 
времён RAII и стандартных контейнеров 
• new по умолчанию не используется при работе 
со стандартной библиотекой 
• Постараемся не использовать new при работе 
с другими библиотеками 
– Свои объекты со счётчиком ссылок 
– Свои умные указатели 
– Своё управление памятью 
• Теперь и new по умолчанию не используется 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
18
Как? 
Некоторые подробности использования 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
19
Объекты со счётчиком ссылок 
• OpenSceneGraph 
– Открытый 3D-движок под OpenGL на С++ 
– osg::Referenced – класс со счётчиком ссылок, 
базовый для большинства классов 
• ref() увеличивает счётчик 
• unref() уменьшает счётчик и удаляет объект если 
счётчик становится равен нулю 
– osg::ref_ptr<T> – умный указатель 
• вызывает ref() в конструкторе 
• вызывает unref() в деструкторе 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
20
OSG: C++ & RAII 
• Пример кода из [Wang2010, стр. 78] 
• Идеально подходит для апгрейда 
– Может быть выполнен автоматически 
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array; 
// Init vertices 
osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array; 
// Init normals 
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry; 
geom->setVertexArray(vertices.get()); 
geom->setNormalArray(normals.get()); 
// Further init geometry and use it 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
21
OSG: Modern C++ 
namespace osg 
{ 
template<typename T, typename... Args> 
osg::ref_ptr<T> make_ref(Args&&... args) 
{ 
return new T(std::forward<Args>(args)...); 
} 
} 
auto vertices = osg::make_ref<osg::Vec3Array>(); 
// Init vertices 
auto normals = osg::make_ref<osg::Vec3Array>(); 
// Init normals 
auto geom = osg::make_ref<osg::Geometry>(); 
geom->setVertexArray(vertices.get()); 
geom->setNormalArray(normals.get()); 
// Further init geometry and use it 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
22
Своё управление памятью 
• Qt 
– Cross-platform application and UI framework 
– QObject – класс, устанавливающий отношение 
родства, базовый для большинства классов 
• Имеет список детей, удаляет их в своём деструкторе 
• Имеет ссылку на родителя, которая может быть null 
• Может менять родителя в процессе жизни 
– QSharedPointer – аналог std::shared_ptr 
• Предоставляет QSharedPointer<T>::create() по 
аналогии с std::make_shared<T>() 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
23
QObject 
• Сценарии использования: 
– Создание объекта в стеке 
• Удаляется при выходе из блока 
– Динамическое создание объекта с родителем 
• Удаляется родителем 
– Динамическое создание объекта без родителя 
• Нужно указать родителя или удалить вручную 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
24
Qt::MakeChild 
• Обёртка для безопасного сценария (см. 
обсуждение). 
• Теперь new означает небезопасный сценарий 
namespace Qt 
{ 
template<class T, class... Args> 
T* MakeChild(Args&&... args) 
{ 
T* pObject = new T(std::forward<Args>(args)...); 
Q_ASSERT(pObject->parent() != nullptr); 
return pObject; 
} 
} 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
25
Qt::MakeChild 
MyWidget::MyWidget() 
{ 
// Safe, created on the stack 
QProgressDialog progress("In progress...", "Cancel", 0, 100); 
// Safe, parent is specified 
{ 
// Regular, valid since C++98 
QPushButton* pButton = new QPushButton("Push me", this); 
// Proposed, modern C++ style 
auto pButton2 = Qt::MakeChild<QPushButton>("And me", this); 
} 
// Unsafe, parent is null, need manual delete 
m_pDialog = new QDialog(); 
} 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
26
Необходимые возможности С++14 
• Возможности языка: 
– Точная передача (perfect forwarding) 
– Шаблоны с переменным количеством 
параметров (variadic templates) 
• Возможности стандартной библиотеки: 
– Умные указатели 
– std::make_shared, std::make_unique 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
27 
Можно обойтись 
и без них 
Можно написать 
самому
Заключение 
• Хороший код – простой код 
• Принцип «по умолчанию» для упрощения 
• Проблемы с delete давно известны 
• Для стандартной библиотеки код без new 
лучше, это объявляется подходом по 
умолчанию – для упрощения 
• new и delete теперь ассоциируются с 
небезопасными операциями 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
28
Спасибо за внимание! 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
29
Библиография 
[McConnell2004] McConnell, Steve, and Detlef Johannis. Code 
complete. Vol. 2. Redmond: Microsoft press, 2004. 
[Wang2010]Wang, Rui, and Xuelei Qian. OpenSceneGraph 3.0: 
Beginner's guide. Packt Publishing Ltd, 2010. 
[Lavavej2012] Lavavej, Stephan. STL11: Magic && Secrets. Going 
Native, 2012. 
[Stroustrup2013] Stroustrup, Bjarne. A Tour of C++. Addison- 
Wesley, 2013. 
[Stroustrup2014] Stroustrup, Bjarne. Make Simple Tasks Simple! 
CppCon, 2014. 
[Sutter2014] Sutter, Herb. Back to the Basics! Essentials of 
Modern C++ Style. CppCon, 2014. 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
30
Принцип «по умолчанию» 
Задача Решение по умолчанию 
Передача параметров в функцию Pass by value or const& 
См. [Sutter2014] 
Возврат параметров из функции Return by value 
См. [Sutter2014] 
Массив произвольного размера? 
Массив изменяющегося размера? 
Список произвольных объектов? 
std::vector 
Массив фиксированного размера std::array 
Действие над каждым элементом 
контейнера 
range-based for 
Автоматическое управление 
динамической памятью 
std::make_unique или std::make_shared 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
31
Выражение намерения 
• Что сделать, а не как сделать 
• Более высокоуровневый код 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
32
Память – ресурс 
std∷make_unique 
new/delete 
= 
new/delete 
malloc/free 
= 
std∷fstream 
fopen/fclose 
Матросов Михаил, С++ без new и delete, 
Russian C++ User Group, Саратов, 2014 
33

More Related Content

What's hot

Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
Alexander Granin
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
Yandex
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
Python Meetup
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Mikhail Matrosov
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Python Meetup
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
Alexey Paznikov
 
Конкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнерыКонкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнеры
Platonov Sergey
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
Roman Orlov
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
Alexey Paznikov
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
Andrey Karpov
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Java8. Innovations
Java8. InnovationsJava8. Innovations
Java8. Innovations
Nakraynikov Oleg
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Mikhail Kurnosov
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
Vasil Remeniuk
 
Java 8. Lambdas
Java 8. LambdasJava 8. Lambdas
Java 8. Lambdas
Nakraynikov Oleg
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
Alexey Paznikov
 

What's hot (19)

Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
Конкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнерыКонкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнеры
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Java8. Innovations
Java8. InnovationsJava8. Innovations
Java8. Innovations
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
 
Java 8. Lambdas
Java 8. LambdasJava 8. Lambdas
Java 8. Lambdas
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
 

Viewers also liked

GoITeens: Дети, которые изменят мир. Как воспитать будущих IT гениев?
GoITeens: Дети, которые изменят мир. Как воспитать будущих IT гениев?GoITeens: Дети, которые изменят мир. Как воспитать будущих IT гениев?
GoITeens: Дети, которые изменят мир. Как воспитать будущих IT гениев?
GoIT
 
OO Design with C++: 1. Inheritance, part 1
OO Design with C++: 1. Inheritance, part 1OO Design with C++: 1. Inheritance, part 1
OO Design with C++: 1. Inheritance, part 1Dmitry Stillermann
 
OO Design with C++: 2. Inheritance, part 2
OO Design with C++: 2. Inheritance, part 2OO Design with C++: 2. Inheritance, part 2
OO Design with C++: 2. Inheritance, part 2Dmitry Stillermann
 
OO Design with C++: 6. Templates & Patterns
OO Design with C++: 6. Templates & PatternsOO Design with C++: 6. Templates & Patterns
OO Design with C++: 6. Templates & PatternsDmitry Stillermann
 
Smart Pointers
Smart PointersSmart Pointers
Smart Pointers
Roman Okolovich
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Yandex
 
Effective stl notes
Effective stl notesEffective stl notes
Effective stl notes
Uttam Gandhi
 
High Order Function Computations in c++14 (C++ Dev Meetup Iasi)
High Order Function Computations in c++14 (C++ Dev Meetup Iasi)High Order Function Computations in c++14 (C++ Dev Meetup Iasi)
High Order Function Computations in c++14 (C++ Dev Meetup Iasi)
Ovidiu Farauanu
 
Dependency Injection in C++ (Community Days 2015)
Dependency Injection in C++ (Community Days 2015)Dependency Injection in C++ (Community Days 2015)
Dependency Injection in C++ (Community Days 2015)
Daniele Pallastrelli
 
Effective c++notes
Effective c++notesEffective c++notes
Effective c++notes
Uttam Gandhi
 
Modern C++
Modern C++Modern C++
Modern C++
Richard Thomson
 
C traps and pitfalls for C++ programmers
C traps and pitfalls for C++ programmersC traps and pitfalls for C++ programmers
C traps and pitfalls for C++ programmers
Richard Thomson
 
С++ without new and delete
С++ without new and deleteС++ without new and delete
С++ without new and delete
Platonov Sergey
 
Memory Management C++ (Peeling operator new() and delete())
Memory Management C++ (Peeling operator new() and delete())Memory Management C++ (Peeling operator new() and delete())
Memory Management C++ (Peeling operator new() and delete())
Sameer Rathoud
 
Operator Overloading
Operator OverloadingOperator Overloading
Operator Overloading
Dustin Chase
 
STL Algorithms In Action
STL Algorithms In ActionSTL Algorithms In Action
STL Algorithms In Action
Northwest C++ Users' Group
 
Multithreading 101
Multithreading 101Multithreading 101
Multithreading 101
Tim Penhey
 
C++ Dependency Management 2.0
C++ Dependency Management 2.0C++ Dependency Management 2.0
C++ Dependency Management 2.0
Patrick Charrier
 
C++ Memory Management
C++ Memory ManagementC++ Memory Management
C++ Memory Management
Anil Bapat
 

Viewers also liked (20)

GoITeens: Дети, которые изменят мир. Как воспитать будущих IT гениев?
GoITeens: Дети, которые изменят мир. Как воспитать будущих IT гениев?GoITeens: Дети, которые изменят мир. Как воспитать будущих IT гениев?
GoITeens: Дети, которые изменят мир. Как воспитать будущих IT гениев?
 
OO Design with C++: 1. Inheritance, part 1
OO Design with C++: 1. Inheritance, part 1OO Design with C++: 1. Inheritance, part 1
OO Design with C++: 1. Inheritance, part 1
 
OO Design with C++: 2. Inheritance, part 2
OO Design with C++: 2. Inheritance, part 2OO Design with C++: 2. Inheritance, part 2
OO Design with C++: 2. Inheritance, part 2
 
OO Design with C++: 6. Templates & Patterns
OO Design with C++: 6. Templates & PatternsOO Design with C++: 6. Templates & Patterns
OO Design with C++: 6. Templates & Patterns
 
Smart Pointers
Smart PointersSmart Pointers
Smart Pointers
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Effective stl notes
Effective stl notesEffective stl notes
Effective stl notes
 
High Order Function Computations in c++14 (C++ Dev Meetup Iasi)
High Order Function Computations in c++14 (C++ Dev Meetup Iasi)High Order Function Computations in c++14 (C++ Dev Meetup Iasi)
High Order Function Computations in c++14 (C++ Dev Meetup Iasi)
 
Dependency Injection in C++ (Community Days 2015)
Dependency Injection in C++ (Community Days 2015)Dependency Injection in C++ (Community Days 2015)
Dependency Injection in C++ (Community Days 2015)
 
Effective c++notes
Effective c++notesEffective c++notes
Effective c++notes
 
Modern C++
Modern C++Modern C++
Modern C++
 
C traps and pitfalls for C++ programmers
C traps and pitfalls for C++ programmersC traps and pitfalls for C++ programmers
C traps and pitfalls for C++ programmers
 
С++ without new and delete
С++ without new and deleteС++ without new and delete
С++ without new and delete
 
Memory Management C++ (Peeling operator new() and delete())
Memory Management C++ (Peeling operator new() and delete())Memory Management C++ (Peeling operator new() and delete())
Memory Management C++ (Peeling operator new() and delete())
 
Operator Overloading
Operator OverloadingOperator Overloading
Operator Overloading
 
STL Algorithms In Action
STL Algorithms In ActionSTL Algorithms In Action
STL Algorithms In Action
 
Multithreading 101
Multithreading 101Multithreading 101
Multithreading 101
 
C++ Dependency Management 2.0
C++ Dependency Management 2.0C++ Dependency Management 2.0
C++ Dependency Management 2.0
 
C++ Memory Management
C++ Memory ManagementC++ Memory Management
C++ Memory Management
 
File Pointers
File PointersFile Pointers
File Pointers
 

Similar to Михаил Матросов, “С++ без new и delete”

Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
CocoaHeads
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
CUSTIS
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9Technopark
 
Cоздание приложений со знанием Perl
Cоздание приложений со знанием PerlCоздание приложений со знанием Perl
Cоздание приложений со знанием Perl
Anatoly Sharifulin
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
Mikhail Shcherbakov
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
Fedor Vompe
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
Mikhail Shcherbakov
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
Ivan Krylov
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Nikolay Samokhvalov
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
Yauheni Akhotnikau
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
Alexander Gornik
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
Глеб Тарасов
 
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графахПавел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
Yandex
 
Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)Optima-PROMO
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Fwdays
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
Andrey Karpov
 

Similar to Михаил Матросов, “С++ без new и delete” (20)

Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
 
Cоздание приложений со знанием Perl
Cоздание приложений со знанием PerlCоздание приложений со знанием Perl
Cоздание приложений со знанием Perl
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данныхПромышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
Промышленный подход к тюнингу PostgreSQL: эксперименты над базами данных
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графахПавел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
 
Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 

More from Platonov Sergey

Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Platonov Sergey
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
Platonov Sergey
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.
Platonov Sergey
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Platonov Sergey
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Platonov Sergey
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIДмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
Platonov Sergey
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Platonov Sergey
 
QML\Qt Quick на практике
QML\Qt Quick на практикеQML\Qt Quick на практике
QML\Qt Quick на практике
Platonov Sergey
 
Визуализация автомобильных маршрутов
Визуализация автомобильных маршрутовВизуализация автомобильных маршрутов
Визуализация автомобильных маршрутов
Platonov Sergey
 
Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++
Platonov Sergey
 
C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
Platonov Sergey
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Platonov Sergey
 
HPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийHPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычислений
Platonov Sergey
 
Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08
Platonov Sergey
 
Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...
Platonov Sergey
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Platonov Sergey
 
One definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьOne definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим жить
Platonov Sergey
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
Platonov Sergey
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
Platonov Sergey
 

More from Platonov Sergey (20)

Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIДмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 
QML\Qt Quick на практике
QML\Qt Quick на практикеQML\Qt Quick на практике
QML\Qt Quick на практике
 
Визуализация автомобильных маршрутов
Визуализация автомобильных маршрутовВизуализация автомобильных маршрутов
Визуализация автомобильных маршрутов
 
Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++
 
C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
 
HPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийHPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычислений
 
Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08
 
Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
 
One definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьOne definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим жить
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
 

Михаил Матросов, “С++ без new и delete”

  • 1. C++ без new и delete Матросов Михаил mikhail.matrosov@gmail.com Russian C++ User Group, Саратов, 2014
  • 2. Вместо содержания • Что? – Писать код без new и delete в современном С++ • Как? – Контейнеры STL – std::make_shared, std::make_unique – Cвои обёртки для своих умных указателей • Почему? – new и delete увеличивают сложность кода Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 2
  • 3. Современный С++ • Современный С++ включает – Возможности стандарта С++14 – Современные best practices • C++14 is done! – Рабочий черновик стандарта ISO/IEC 14882:2014(E) единогласно одобрен – Полностью или частично поддерживается всеми мажорными компиляторами Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 3
  • 4. Что и как? Общие рекомендации Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 4
  • 5. Объекты в С typedef struct ObjectTag { // Object members } Object; int InitObject(Object* io_pObject); int UseObject(Object* io_pObject); int ClearObject(Object* io_pObject); void ObjectsInC() { Object* pObject; pObject = malloc(sizeof(Object)); // Allocate memory InitObject(pObject); // Establish invariants and acquire resources UseObject(pObject); // Do the work ClearObject(pObject); // Release resources free(pObject); // Release memory // By the way: error handling :-/ } Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 5
  • 6. Объекты в С++ • Инкапсуляция: – Конструкторы – Деструкторы – Методы class Object { // Object members public: Object(); // Establish invariants and acquire resources ~Object(); // Release resources void Use(); // Do the work }; • Обработка ошибок: – Исключения Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 6
  • 7. Объекты в С++ • 2 лучше, чем 1 – управление ресурсами // 1. Naive C++ style Object* p = new Object(); // Allocate memory p->Use(); // Do the work delete p; // Release memory • 3 лучше, чем 2 – unique_ptr делает всё, что и auto_ptr, только лучше • 4 лучше, чем 3 – основная тема доклада // 2. More secure C++98 with RAII std::auto_ptr<Object> ap(new Object()); // Allocate memory ap->Use(); // Do the work // 3. More secure C++11 with RAII std::unique_ptr<Object> up(new Object()); // Allocate memory up->Use(); // Do the work // 4. New bullet-proof modern C++ auto up2 = std::make_unique<Object>(); // Create unique object up2->Use(); // Do the work Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 7
  • 8. Разделяемые объекты в С++ void UseObject(Object*); // Shall retain the object void AcceptObject(Object*); // Shall delete the object void ShareObject(std::shared_ptr<Object>); // Both cases // Naive C++ Object* p = new Object(); p->Use(); UseObject(p); // Want to use object after call p->Use(); AcceptObject(p); // No longer need the object // C++98 & RAII /* No way to say this! */ // Modern C++ auto sp = std::make_shared<Object>(); sp->Use(); ShareObject(sp); // Want to use object after call sp->Use(); ShareObject(std::move(sp)); // No longer need the object Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 8
  • 9. Объекты со счётчиком ссылок в С++ // Naive C++ (not used) RefCounted* p = new RefCounted(); p->AddRef(); p->Use(); p->Release(); // C++98 & RAII RefPtr<RefCounted> rp = new RefCounted(); rp->Use(); // Modern C++ auto rp2 = MakeRefPtr<RefCounted>(); rp2->Use(); Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 9
  • 10. Динамические массивы в С++ void UseArray(int*); int n = 100; // Naive C++ int* p = new int[n]; UseArray(p); delete[] p; // C++98 & RAII std::vector<int> v(n); UseArray(&v[0]); // Modern C++ std::vector<int> v2(n); UseArray(v2.data()); Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 10
  • 11. Почему? Аргументация Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 11
  • 12. Лучше == проще • Немного авторитета: – Главный технический императив разработки ПО – управление сложностью [McConnel2004] – Make Simple Tasks Simple! [Stroustrup2014] – ≈99.9998% разработчиков – не эксперты [Sutter2014] – Принцип KISS (Keep It Simple, Stupid) • Что значит проще? – Простые задачи должны решаться просто – Сложные – не сложнее, чем необходимо – Сначала – простота, затем – производительность • Как сделать проще? – Принцип DRY (Don’t Repeat Yourself) – Принцип «по умолчанию» [Sutter2014] Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 12
  • 13. Принцип «по умолчанию» • Основная мысль: – Известная задача ⇒ известное решение • Преимущества: – Взаимопонимание с другими разработчиками – Уменьшение порога входа для новичков – Меньше думать – продуктивная лень  – Все те же, что и для правил кодирования • “A tour of C++” [Stroustrup2013] Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 13
  • 14. std::make_unique<T>() vs. std::unique_ptr(new T) int GenerateId(); std::pair<std::unique_ptr<Object>, int> MakeObjectWithIdWrong() { return std::make_pair( std::unique_ptr<Object>(new Object()), GenerateId()); } std::pair<std::unique_ptr<Object>, int> MakeObjectWithIdRight() { return std::make_pair( std::make_unique<Object>(), // Safe GenerateId()); } Дублирование имени типа. DRY! Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 14 // May throw // May leak!
  • 15. std::make_shared<T>() vs. std::shared_ptr(new T) std::shared_ptr<Object> sp(new Object()); counter Object sp Два выделения памяти Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 15
  • 16. std::make_shared<T>() vs. std::shared_ptr(new T) auto sp = std::make_shared<Object>(); Одно выделение памяти. Оптимизация We Know Where You Live [Lavavej2012]. counter Object sp Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 16
  • 17. std::make_shared и std::make_unique • Плюсы обоих: – Безопасность при исключениях – Нет дублирования имени типа • Плюсы std::make_shared: – Одно обращение к менеджеру памяти • Минусы есть, но несущественные: – Нет формы для указания собственного аллокатора для std::unique_ptr (для std::shared_ptr это std::allocated_shared) – Опасность false sharing объекта и счётчика ссылок [см. вопрос на StackOverflow] Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 17
  • 18. Обобщаем • delete по умолчанию не используется со времён RAII и стандартных контейнеров • new по умолчанию не используется при работе со стандартной библиотекой • Постараемся не использовать new при работе с другими библиотеками – Свои объекты со счётчиком ссылок – Свои умные указатели – Своё управление памятью • Теперь и new по умолчанию не используется Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 18
  • 19. Как? Некоторые подробности использования Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 19
  • 20. Объекты со счётчиком ссылок • OpenSceneGraph – Открытый 3D-движок под OpenGL на С++ – osg::Referenced – класс со счётчиком ссылок, базовый для большинства классов • ref() увеличивает счётчик • unref() уменьшает счётчик и удаляет объект если счётчик становится равен нулю – osg::ref_ptr<T> – умный указатель • вызывает ref() в конструкторе • вызывает unref() в деструкторе Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 20
  • 21. OSG: C++ & RAII • Пример кода из [Wang2010, стр. 78] • Идеально подходит для апгрейда – Может быть выполнен автоматически osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array; // Init vertices osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array; // Init normals osg::ref_ptr<osg::Geometry> geom = new osg::Geometry; geom->setVertexArray(vertices.get()); geom->setNormalArray(normals.get()); // Further init geometry and use it Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 21
  • 22. OSG: Modern C++ namespace osg { template<typename T, typename... Args> osg::ref_ptr<T> make_ref(Args&&... args) { return new T(std::forward<Args>(args)...); } } auto vertices = osg::make_ref<osg::Vec3Array>(); // Init vertices auto normals = osg::make_ref<osg::Vec3Array>(); // Init normals auto geom = osg::make_ref<osg::Geometry>(); geom->setVertexArray(vertices.get()); geom->setNormalArray(normals.get()); // Further init geometry and use it Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 22
  • 23. Своё управление памятью • Qt – Cross-platform application and UI framework – QObject – класс, устанавливающий отношение родства, базовый для большинства классов • Имеет список детей, удаляет их в своём деструкторе • Имеет ссылку на родителя, которая может быть null • Может менять родителя в процессе жизни – QSharedPointer – аналог std::shared_ptr • Предоставляет QSharedPointer<T>::create() по аналогии с std::make_shared<T>() Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 23
  • 24. QObject • Сценарии использования: – Создание объекта в стеке • Удаляется при выходе из блока – Динамическое создание объекта с родителем • Удаляется родителем – Динамическое создание объекта без родителя • Нужно указать родителя или удалить вручную Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 24
  • 25. Qt::MakeChild • Обёртка для безопасного сценария (см. обсуждение). • Теперь new означает небезопасный сценарий namespace Qt { template<class T, class... Args> T* MakeChild(Args&&... args) { T* pObject = new T(std::forward<Args>(args)...); Q_ASSERT(pObject->parent() != nullptr); return pObject; } } Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 25
  • 26. Qt::MakeChild MyWidget::MyWidget() { // Safe, created on the stack QProgressDialog progress("In progress...", "Cancel", 0, 100); // Safe, parent is specified { // Regular, valid since C++98 QPushButton* pButton = new QPushButton("Push me", this); // Proposed, modern C++ style auto pButton2 = Qt::MakeChild<QPushButton>("And me", this); } // Unsafe, parent is null, need manual delete m_pDialog = new QDialog(); } Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 26
  • 27. Необходимые возможности С++14 • Возможности языка: – Точная передача (perfect forwarding) – Шаблоны с переменным количеством параметров (variadic templates) • Возможности стандартной библиотеки: – Умные указатели – std::make_shared, std::make_unique Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 27 Можно обойтись и без них Можно написать самому
  • 28. Заключение • Хороший код – простой код • Принцип «по умолчанию» для упрощения • Проблемы с delete давно известны • Для стандартной библиотеки код без new лучше, это объявляется подходом по умолчанию – для упрощения • new и delete теперь ассоциируются с небезопасными операциями Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 28
  • 29. Спасибо за внимание! Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 29
  • 30. Библиография [McConnell2004] McConnell, Steve, and Detlef Johannis. Code complete. Vol. 2. Redmond: Microsoft press, 2004. [Wang2010]Wang, Rui, and Xuelei Qian. OpenSceneGraph 3.0: Beginner's guide. Packt Publishing Ltd, 2010. [Lavavej2012] Lavavej, Stephan. STL11: Magic && Secrets. Going Native, 2012. [Stroustrup2013] Stroustrup, Bjarne. A Tour of C++. Addison- Wesley, 2013. [Stroustrup2014] Stroustrup, Bjarne. Make Simple Tasks Simple! CppCon, 2014. [Sutter2014] Sutter, Herb. Back to the Basics! Essentials of Modern C++ Style. CppCon, 2014. Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 30
  • 31. Принцип «по умолчанию» Задача Решение по умолчанию Передача параметров в функцию Pass by value or const& См. [Sutter2014] Возврат параметров из функции Return by value См. [Sutter2014] Массив произвольного размера? Массив изменяющегося размера? Список произвольных объектов? std::vector Массив фиксированного размера std::array Действие над каждым элементом контейнера range-based for Автоматическое управление динамической памятью std::make_unique или std::make_shared Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 31
  • 32. Выражение намерения • Что сделать, а не как сделать • Более высокоуровневый код Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 32
  • 33. Память – ресурс std∷make_unique new/delete = new/delete malloc/free = std∷fstream fopen/fclose Матросов Михаил, С++ без new и delete, Russian C++ User Group, Саратов, 2014 33