Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
здесь мы, например, не всегда сможем быстро сказать где конкретно (и когда) будет удален объект.
Если же мы используем сырые указетели, то место удаления можно предсказать с точностью 100%.
Этот out-of-scope ещё надо найти
Стандартных библиотек, кстати, несколько. Каждую изучать?
printArray(ptr), а она ptr и удалила. Тоже долго искать будете.Это что же, везде сидеть искать где заканчивается scope?
Боюсь что этот пример как раз показывает отсутствие преимуществ у «умных» указателей в данном случае, т. к. неумелый программист может и reset сделать где не надо, что полностью нивелирует профит.
segmantation fault получим более очевидный assert: deref null ptr. Конечно, от дурака это не спасает, а от невыспавшегося программиста — вполне.Я имел в виду реализации стандартных библиотек. У которых местами немного разное поведение.
[/g/projects/DOOM-3-BFG]$ cat `find . -name \*.cpp -or -name \*.h` | wc -l
563595
[/g/qt-everywhere-opensource-src-5.0.0/qtwebkit/Source]$ cat `find . -name \*.cpp -or -name \*.h` | wc -l
2147287
void* pool_malloc(size_t sz)
{
std::cout << "creating in pool\n";
return malloc(sz); /*fallback*/
}
void pool_free(void*ptr)
{
std::cout << "free in pool\n";
free(ptr);
}
template <typename T>
struct my_deleter
{
void operator()(T*ptr) const
{
ptr->~T();
pool_free(ptr);/*fallback*/
}
};
template <typename T>
using pool_ptr = std::unique_ptr<T, my_deleter<T>>;
template <typename T>
struct my_alllocator
{
template <typename... Args>
T* operator()(Args... args) const
{
void* t = pool_malloc(sizeof(T));
assert(t);
new (t) T(args...);
return static_cast<T*>(t);
}
};
template <typename T, typename...Args>
pool_ptr<T> pool_alloc(Args... args)
{
T* ptr = my_alllocator<T>()(args...);
return pool_ptr<T>(ptr);
}
/*usage*/
int main()
{
pool_ptr<int> ptr = pool_alloc<int>(42);
}
лазерный прицел теперь не может быть использован вместе с оружием.
Открыть Visual Studio 2010 Express и нажать F8 для компиляции. Готово!
Движок idTech 4, которому уже почти 10 лет был обновлен до idTech 5 (Rage — первая игра на этом движке), и с его исходным кодом ознакомиться было очень интересно.
Я бы назвал движок «idTech4 улучшенный», т.к. по сути это idTech4, но с использованием элементов idTech5:
DOOM 3 BFG — обзор исходного кода: введение (часть 1 из 4)