в моем коде я использую HANDLE
s от windows.h
. Они используются как
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");
}
Как видите, вы должны вставить это CloseHandle
в каждое исключение, которое может произойти в середине процесса получения и выпуска. Поэтому, скорее всего, вы забудете одно (или есть необычное исключение SEH, о котором вы не знали) и вуаля, у вас утечка памяти.
Недавно я прочитал о RAII, который должен устранить головные боли в таких случаях и должен автоматически вызывать это CloseHandle
. Я также видел, что в C ++ есть что-то вроде std::auto_ptr<someType>
, которое решает проблему для ресурсов, которые были выделены с помощью new
.
Однако, поскольку я не использую new
и поскольку HANDLE
просто typedef
обозначен как void *
, мне интересно, как мне использовать std::auto_ptr<someType>
. Каким-то образом должно быть возможно дать ему пользовательскую функцию удаления (if (!CloseHandle(h)) { throw std::exception("closeHandle error"); }
). Создание класса было бы другим методом, поскольку деструктор вызывается каждый раз, когда его экземпляр выходит из области видимости. Однако иметь класс для каждой простой вещи просто излишне.
Как я могу исправить эти случайные утечки памяти?
Обратите внимание, что я бы предпочел решения на чистом C ++ без библиотек и больших зависимостей, за исключением случаев, когда они действительно малы и в любом случае используются в большинстве сред.