When does your SkinnedMesh destructor run? It seems obvious that you've got a D3D resource leak rather than just a regular memory leak (so a regular memory leak detector will be no use whatsoever to you), so if your SkinnedMesh destructor is running after you Release the rest of your D3D objects, this can happen.

One way to work around this would be to AddRef your Device in the SkinnedMesh constructor, then Release it in the destructor; this will ensure proper lifetime management for the Device. You may probably also need to do so for your LPDIRECT3D9 too (generally I never use constructor/destructor logic for managing D3D objects as it can be prone to issues such as this, so I can't say anything more here).

It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.

Uhm. You have no destructor function in BoneMesh, which means you are not calling Release() on the IDirect3DTexture9's. If you're calling delete on the bone mesh (and not it's base type), then the materials array should be handled already.