На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Динамический массив и WinInet , не получается освободить память
    Создаю динамический массив. Передаю его используя WSASend. Потом пытаюсь его освободить делая delete[] st; и ничего. Ошибка.
    В чем юмор. Мне не жалко в данном месте можно и статический. Но просто интерестно. Тем более что статический не везде покатит.
    ExpandedWrap disabled
      //Forming head of send string
      BOOL  FormString(DWORD nFlSize, char* cRz, int* nRz)
      {
          memset(cRz, '0', FLSIZESTRLEN);
          static char cTmp[FLSIZESTRLEN];
          itoa(nFlSize, cTmp, 10);
          static int nStr = strlen(cTmp);
          for (int it = 1; (nStr - it)>= 0; it++)
              cRz[FLSIZESTRLEN - it] = cTmp[strlen(cTmp) - it];
          cRz[FLSIZESTRLEN] = 0;
       
          char st[255];
          sprintf(st, "#%s#%s%s#",CONTRCODE, SENDSCRSHOT, cRz);
          strcpy(cRz, st);
          return TRUE;
      }
       
      BOOL SendScreenShort(SOCKET socket)
      {
              
          char st = new char[STRMAX];
       
          WSABUF wsaBuf;  
          INT    iSz;                             //Size of Jpeg buffer
          DWORD  nSend;                           //Bytes was send
          LPVOID bfImg =  MakeScreenShort(&iSz);  //Receive Jpeg Buffer
       
          FormString(iSz, st, NULL);
          
          wsaBuf.buf  = st;
          wsaBuf.len  = strlen(st);
          
          if (WSASend(socket, &wsaBuf, 1, &nSend, 0, NULL, NULL))
          {
              int iErr = WSAGetLastError();
              if (iErr == WSAENOBUFS)
              {
                  MessageBox(NULL, "Send Error; The Windows Sockets provider reports a buffer deadlock.", "ERROR", MB_ICONERROR);
                  return FALSE;
              }
          }
          wsaBuf.buf = (CHAR*)bfImg;
          wsaBuf.len = iSz;
          if (WSASend(socket, &wsaBuf, 1, &nSend, 0, NULL, NULL))
          {
              int iErr = WSAGetLastError();
              if (iErr == WSAENOBUFS)
              {
                  MessageBox(NULL, "Send Error; The Windows Sockets provider reports a buffer deadlock.", "ERROR", MB_ICONERROR);
                  return FALSE;
              }
          }
          wsaBuf.buf = NULL;
          delete[] st;                //Exception
       
          return TRUE;
      }

    Чувствую я где-то сильно затупил.
      char st = new char[STRMAX];
      замени на
      char* st = new char[STRMAX];
        Это очепятка. Там со звездочкой.
          какой ексепшон?
          С++ или SEH?
          посмотри отладчиком, что происходит с указателем
            st вроде нормальный. не мусор.
            вылетаетна строчке
            ExpandedWrap disabled
              _free_dbg( pUserData, pHead->nBlockUse );


            Expression _CrtIsValidHeapPointer(pUserData) - dbgheap.c.



            Цитата LuckLess @
            SEH

            А что это?
              Цитата devmstr @
              _CrtIsValidHeapPointer

              Цитата devmstr @
              Цитата (LuckLess @ Сегодня, 17:20)
              SEH
              А что это?

              Виндовые (Structured Exception Handling) исключения.
              всеже указатель становаиться невалидным, в какойто момент.

              используя CrtIsValidHeapPointer проверяй его на валидность.
              и найди то место, в котором он становиться невалидным.
                Цитата devmstr @
                Создаю динамический массив.

                Лучше использовать vector<unsigned char>
                И проблем с памятью не будет
                  devmstr,

                  Где-то затираешь буфер свой.

                  На первый взгляд, тут неясность - создаешь буфер длиной STRMAX, а нулишь его по размеру FLSIZESTRLEN, ну и дальше там везде FLSIZESTRLEN...

                  Потом... nStr = strlen(cTmp); Допустим, nStr 25, а FLSIZESTRLEN 20... Получится, что пишешь по отрицательным индексам в буфер. А там сишный рантайм хранит свою инфу (pHead->nBlockUse это как раз ее проверка)

                  Нельзя так с буферами работать... В лучшем случае экспшен, в худшем - уязвимость, а уязвимость + Винсок = троян.
                    devmstr, зачем тебе такое извращение в FormString?
                    Там всё это можно записать в одну строчку:
                    ExpandedWrap disabled
                      BOOL  FormString(DWORD nFlSize, char* cRz, int* nRz)
                      {
                          sprintf( cRz, "#%s#%s%*u#",CONTRCODE, SENDSCRSHOT, FLSIZESTRLEN, nFlSize);
                          return TRUE;
                      }

                    Если я правильно понял, и FLSIZESTRLEN у тебя означает длину поля для размера. Да и функция собсна получается нафих не нужна :lol:
                    ЗЫ. А вообще, на будущее - это считается плохим стилем, писать функцию, в которой происходит запись в память без ограничения...
                      А нулевой байт в строке учитывали?
                        Ace
                        Мне просто нужно было, что бы число было обязательно длиной в 8 байт. Но это помойму можно тоде реализовать с помощью sprintf. :)

                        Всем спасибо. Глюк нашел. На будущее постараюсь писать по аккуратнее.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0371 ]   [ 16 queries used ]   [ Generated: 29.03.24, 14:45 GMT ]