as far as I know, the standard demands the template arguments to be a complete type
The C++ standard explicitly mentions an exception for unique pointers:
[...] The template parameter T of unique_ptr may be an incomplete type.
But you have to define an empty destructor in the .cpp file, since the compiler requires a complete type when destroying the object. To avoid raw pointers even in cases where you need value semantics and copied ownership, my
aurora::CopiedPtr might be interesting (it doesn't require the definition of destructor, copy constructor and copy assignment operator)...
No need to spend effort for the Valgrind file, people should rather learn to use RAII