Файл записи с перекрытием иногда выдает мне ERROR_INVALID_HANDLE. Правильно ли я делаю memset?

#c #writefile

Вопрос:

Я использую файл записи для записи в файл, и иногда я получаю ошибку ERROR_INVALID_HANDLE. Я читал, что это может быть связано с тем, что значение ДЕСКРИПТОРА в Overlapped недопустимо. Но мне просто трудно это понять. Интересно, не выходит ли что-то за рамки? Буду признателен, если кто-нибудь сможет взглянуть. Я всегда могу добавить больше кода здесь

 const LPOVERLAPPED lpOverlapped = GetOverlapped(true, hFile, ulBufSize, amp;ullFileOffset,volumeName);  if (lpOverlapped == nullptr)  {  CloseHandle(hFile);  return false;  }   if (!WriteFile(hFile,(const PVOID)(((UINT64) s_pMemoryBuffer[volumeName])   iBufferOffset),ulBufSize,amp;dwBytesWritten,lpOverlapped))  {   DWORD errCode = GetLastError(); //Error here  //Why do I get an error code 6 here every now and then  }  

Теперь это метод, который возвращает перекрывающуюся структуру

 LPOVERLAPPED foo::GetOverlapped(bool useOverlappedIo, HANDLE hFile, UINT32 ulBufSize, UINT64* ullFileOffset,const std::stringamp; volumeName) {  if (useOverlappedIo)  {  while (true)  {  int index = 0;  while (index lt; cMaxOverlappedIOS)  {  if (!OverlappedInUse[volumeName][index])  {  OverlappedInUse[volumeName][index] = true;  LPOVERLAPPED overlapped = amp;(OverlappedArray[volumeName][index]);   if (overlapped-gt;hEvent == nullptr) // Need Event  {  overlapped-gt;hEvent = CreateEvent(  nullptr,  TRUE,  TRUE,  nullptr);  if (overlapped-gt;hEvent == nullptr)  {  printf("Error creating event (error code: %u)n", GetLastError());  return nullptr;  }  }   overlapped-gt;Offset = (UINT32)(*ullFileOffset amp; 0xFFFFFFFF); // Low order 32 bits  overlapped-gt;OffsetHigh = (UINT32)(*ullFileOffset gt;gt; 32); // High order 32 bits  *ullFileOffset  = ulBufSize; // Update pointer to next record  return overlapped;  }  // Else Keep looking  index  ;  }  // None available, wait for at least one to free up  if (WaitForPendingIOs(hFile, FALSE,volumeName) != ERROR_SUCCESS)  {  return nullptr;  }  } // Now start loop over again  }  else  {  return nullptr;  } }  

Вот как я инициализирую массив перед вызовом этого кода

 for(auto vol : readVolumes) {  OVERLAPPED* oarray = new OVERLAPPED[cMaxOverlappedIOS];  memset(oarray, 0, sizeof(oarray));  OverlappedArray[vol] = oarray;   bool* boolinuse = new bool[cMaxOverlappedIOS]{false};  OverlappedInUse[vol] = boolinuse;   s_pMemoryBuffer[vol] = nullptr;  s_uDataBufferSize[vol] = 0;  }  

Есть какие-нибудь предложения о том, почему я получу эту ошибку ?

Комментарии:

1. @HansPassant Я добавил, как я создаю OverlappedArray, если это поможет

2. или это должно быть так memset(oarray, 0, (size_t) cMaxOverlappedIOS * sizeof(OVERLAPPED))