in my code I use HANDLE
s from windows.h
. They are used like
HANDLE h;
if (!openHandleToSomething(arg1, arg2, &h)) {
throw std::exception("openHandleToSomething error");
}
/* Use the handle in other functions which can throw as well */
if (!CloseHandle(h)) {
throw std::exception("closeHandle error");
}
As you see, you have to insert this CloseHandle
to every exception which can happen in the middle of acquiration and release. Therefore, it's likely you forget one (or there is a fancy SEH exception which you didn't know about) and voilà, you have your memory leak.
Recently, I've read about RAII which should remove the headaches from such cases and should call this CloseHandle
automatically. I've also seen that there is something like std::auto_ptr<someType>
in C++ which solves the problem for resources which were allocated with new
.
However, since I don't use new
and since HANDLE
is just typedef
ed to be a void *
, I wonder how I should use the std::auto_ptr<someType>
. Somehow, it should be possible to give it a custom deleter function (if (!CloseHandle(h)) { throw std::exception("closeHandle error"); }
). Creating a class would be another method since the destructor gets called any time an instance of it gets out of scope. However, it's just overkill to have a class for every simple thing.
How can I fix these accidential memory leaks?
Note that I would prefer solutions which are in pure C++ with no libraries and big dependencies except if they are really small and used in most of the environments anyways.
shared_ptr
has been designed to to, and do well. This is definitely the best solution (although I usually avoid such absolutes). – Brume