If engine is a part of global allocated object d_func *potentially* can be freed before engine, it will cause a crash in such application.
getCache has a 2 potential problems:
- s_caches can significantly increase its size
- call after destroyed shared pointer will return a nullptr