Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.193.77.196] |
|
Сообщ.
#1
,
|
|
|
Создаю динамический массив. Передаю его используя WSASend. Потом пытаюсь его освободить делая delete[] st; и ничего. Ошибка.
В чем юмор. Мне не жалко в данном месте можно и статический. Но просто интерестно. Тем более что статический не везде покатит. //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; } Чувствую я где-то сильно затупил. |
Сообщ.
#2
,
|
|
|
char st = new char[STRMAX];
замени на char* st = new char[STRMAX]; |
Сообщ.
#3
,
|
|
|
Это очепятка. Там со звездочкой.
|
Сообщ.
#4
,
|
|
|
какой ексепшон?
С++ или SEH? посмотри отладчиком, что происходит с указателем |
Сообщ.
#5
,
|
|
|
st вроде нормальный. не мусор.
вылетаетна строчке _free_dbg( pUserData, pHead->nBlockUse ); Expression _CrtIsValidHeapPointer(pUserData) - dbgheap.c. Цитата LuckLess @ SEH А что это? |
Сообщ.
#6
,
|
|
|
Цитата devmstr @ _CrtIsValidHeapPointer Цитата devmstr @ Цитата (LuckLess @ Сегодня, 17:20) SEH А что это? Виндовые (Structured Exception Handling) исключения. всеже указатель становаиться невалидным, в какойто момент. используя CrtIsValidHeapPointer проверяй его на валидность. и найди то место, в котором он становиться невалидным. |
Сообщ.
#7
,
|
|
|
Цитата devmstr @ Создаю динамический массив. Лучше использовать vector<unsigned char> И проблем с памятью не будет |
Сообщ.
#8
,
|
|
|
devmstr,
Где-то затираешь буфер свой. На первый взгляд, тут неясность - создаешь буфер длиной STRMAX, а нулишь его по размеру FLSIZESTRLEN, ну и дальше там везде FLSIZESTRLEN... Потом... nStr = strlen(cTmp); Допустим, nStr 25, а FLSIZESTRLEN 20... Получится, что пишешь по отрицательным индексам в буфер. А там сишный рантайм хранит свою инфу (pHead->nBlockUse это как раз ее проверка) Нельзя так с буферами работать... В лучшем случае экспшен, в худшем - уязвимость, а уязвимость + Винсок = троян. |
Сообщ.
#9
,
|
|
|
devmstr, зачем тебе такое извращение в FormString?
Там всё это можно записать в одну строчку: BOOL FormString(DWORD nFlSize, char* cRz, int* nRz) { sprintf( cRz, "#%s#%s%*u#",CONTRCODE, SENDSCRSHOT, FLSIZESTRLEN, nFlSize); return TRUE; } Если я правильно понял, и FLSIZESTRLEN у тебя означает длину поля для размера. Да и функция собсна получается нафих не нужна ЗЫ. А вообще, на будущее - это считается плохим стилем, писать функцию, в которой происходит запись в память без ограничения... |
Сообщ.
#10
,
|
|
|
А нулевой байт в строке учитывали?
|
Сообщ.
#11
,
|
|
|
Ace
Мне просто нужно было, что бы число было обязательно длиной в 8 байт. Но это помойму можно тоде реализовать с помощью sprintf. Всем спасибо. Глюк нашел. На будущее постараюсь писать по аккуратнее. |