Я подозреваю, что у вас есть что-то вроде этого:
class SmartPipe
{
HANDLE hPipe;
public:
//Functions which do something to hPipe
~SmartPipe()
{
if (hPipe)
CloseHandle(hPipe);
}
};
Проблема в том, что когда создается SmartPipe
, hPipe инициализируется в случайный мусор. Вы должны инициализировать это самостоятельно. Добавьте hPipe в список инициализаторов в вашем классе:
class SmartPipe
{
HANDLE hPipe;
public:
SmartPipe() : hPipe(0)
{
}
//Functions which do something to hPipe
~SmartPipe()
{
if (hPipe)
CloseHandle(hPipe);
}
};
Если это не ваш сценарий, по крайней мере, убедитесь, что hPipe
где-то инициализируется, даже если его значение равно 0.
РЕДАКТИРОВАТЬ: Это двойной бесплатный сценарий:
class SmartPipe
{
//As above
};
void SomeFunc(SmartPipe input) //Note pass by value
{ //At this point, the pipe object was copied
//2 SmartPipes are alive with the same handle value here.
//Do something with `input`
}
int main()
{
SmartPipe input;
//setup input somehow
SomeFunc(input);
//Note that at this point the pipe passed by value has already been
//destroyed, and the handle held by `input` has already been closed.
} //`input` destroyed here, resulting in a double free.
Решите это, сделав SmartPipe
некопируемым, или напишите конструкторы копирования и операторы копирования для него, которые копируют дескриптор (используя что-то вроде DuplicateHandle
), или подсчет ссылок.