Как исправить это «исключение первого шанса» в c / c ++? - PullRequest
2 голосов
/ 11 сентября 2010

Сообщает An invalid handle was specified. для кода ниже:

 if(hPipe)
  CloseHandle(hPipe);

Что я могу сделать?

Ответы [ 3 ]

4 голосов
/ 11 сентября 2010

Я подозреваю, что у вас есть что-то вроде этого:

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), или подсчет ссылок.

3 голосов
/ 11 сентября 2010
 if (hPipe != INVALID_HANDLE_VALUE && hPipe != 0)
     CloseHandle(hPipe);

INVALID_HANDLE_VALUE равно -1, а не 0, поэтому вы не можете просто сделать if (hPipe).0 - , также - недопустимое значение дескриптора, поэтому вы не можете просто проверить INVALID_HANDLE_VALUE и сделать это.Разве ты не любишь win32?

1 голос
/ 11 сентября 2010

Это означает, что либо hPipe не инициализирован для действительного дескриптора канала, либо он был действительным, но уже был закрыт. Дважды проверьте вашу логику, связанную с этой переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...