3 / 3 / 0
Регистрация: 17.11.2009
Сообщений: 210
|
|
1 | |
"Утечка " памяти. Да или нет?29.09.2010, 13:11. Показов 1250. Ответов 1
Метки нет (Все метки)
Есть фоксовское приложение.
Оно в отдельном потоке запускает комсервер, написанный тоже на фоксе, который запускает одну из двух функций из Dll. Раз, может чаще или реже приложение закрывалось. Подключил обработчики и оюнаружил такое сообщение: Исключение OLE IDispatch, код 0 из Vfpmtapp.Worker.1: Error 8007000E (Недостаточно памяти для завершения операции.) while launching method Pingserver.Pingserver::Snmp.. Приложение крутится круглосуточно и раз в 6 минут запускает этои два метода Поскольку я в си не очень, то возможно, что допустил где-то бяку и возможно в нижеприведенном методе. Гляньте код, может навскидку есть где-то бяка. Понимаю, что ошибка не грубая. Иначе-бы не работало вообще. Функция делает вот, что. Получает IP адрес, OID, и либо номер интерфейса, либо название интерфейса. Если название, то определяю по названию номер. А потом считываю значение параметра по OID. #pragma pack(4) #pragma comment(lib, 'mgmtapi.lib') #pragma comment(lib, 'snmpapi.lib') #define WIN32_LEAN_AND_MEAN #include <pro_ext.h> #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #include <snmp.h> #include <mgmtapi.h> #define GET 1 #define GETNEXT 2 #define WALK 3 #define TRAP 4 #define TIMEOUT 1000 /* milliseconds */ #define RETRIES 3 void NullTerminate(Value FAR *cVal) { _HUnLock(cVal->ev_handle); if (!_SetHandSize(cVal->ev_handle, cVal->ev_length + 1)) { _Error(182); // Not enough memory } ((char FAR *) _HandToPtr(cVal->ev_handle))[cVal->ev_length] = '*' } FAR GetSNMPInfo(ParamBlk FAR *parm) { RFC1157VarBindList variableBindings; LPSNMP_MGR_SESSION session; INT timeout = TIMEOUT; INT retries = RETRIES; BYTE requestType; AsnInteger errorStatus; AsnInteger errorIndex; AsnObjectIdentifier reqObject; AsnObjectIdentifier root; AsnObjectIdentifier tempOid; char *chkPtr = NULL; char *string = NULL; char agent[128]; char community[64]; char oid[255]; char RetWhot[128]; int oper; int operation; int RetType; char rezstr[255]; int rezult = 0; int len = 0; int j = 0; int i = 0; int y = 0; int z = 0; int len1 = 0; int rnum = 0; char abc[1]; // 1 параметр agent _HLock ( parm->p[0].val.ev_handle); NullTerminate(&parm->p[0].val); _StrCpy( (char FAR *) agent, _HandToPtr(parm->p[0].val.ev_handle) ); _HUnLock ( parm->p[0].val.ev_handle ); // 2 параметр community _HLock ( parm->p[1].val.ev_handle); NullTerminate(&parm->p[1].val); _StrCpy( (char FAR *) community, _HandToPtr(parm->p[1].val.ev_handle) ); _HUnLock ( parm->p[1].val.ev_handle ); // 5 параметр timeout timeout = (int) parm->p[4].val.ev_long; // 6 параметр Что получаем _HLock ( parm->p[5].val.ev_handle ); NullTerminate(&parm->p[5].val); _StrCpy( (char FAR *) RetWhot, _HandToPtr(parm->p[5].val.ev_handle) ); _HUnLock ( parm->p[5].val.ev_handle ); variableBindings.list = NULL; variableBindings.len = 0; len1 = strlen(RetWhot); if (len1 > 1) { if ((session = SnmpMgrOpen(agent, community, timeout, retries)) == NULL) { if (RetWhot) free(RetWhot); _RetInt(-3,10); return 0; } // if (errorStatus > 0) // { // if (RetWhot) free(RetWhot); // _RetInt(-3,10); // return 0; // } if (!SnmpMgrStrToOid('.1.3.6.1.2.1.2.2.1.2' { variableBindings.len = 1; if ((variableBindings.list = (RFC1157VarBind *)SNMP_realloc( variableBindings.list, sizeof(RFC1157VarBind) * variableBindings.len)) == NULL) { if (oid) free(oid); SnmpMgrClose(session); _RetInt(-2,10); return 0; } // end if variableBindings.list[0].name = reqObject; variableBindings.list[0].value.asnType = ASN_NULL; } // end else // 4 параметр operation oper = (int) parm->p[3].val.ev_long; if (oper == GET) operation = GET; else if (oper == GETNEXT) operation = GETNEXT; // else if (oper == WALK) // operation = WALK; // else if (oper == TRAP) // operation = TRAP; else { operation = GETNEXT; } if (operation == GET || operation == GETNEXT || operation == WALK) { if (operation == GET) requestType = ASN_RFC1157_GETREQUEST; else requestType = ASN_RFC1157_GETNEXTREQUEST; } if (!SnmpMgrRequest(session, requestType, &variableBindings, &errorStatus, &errorIndex)) { if (oid) free(oid); SnmpMgrClose(session); _RetInt(GetLastError(),10); return 0; } else { // The API succeeded, errors may be indicated from the remote agent. if (errorStatus > 0) { if (oid) free(oid); SnmpMgrClose(session); _RetInt(-5,10); return 0; } else { // Display the resulting variable bindings. RetType = (int) variableBindings.list[0].value.asnType; // SnmpMgrClose(session); // _RetInt(RetType,10); // return 0; switch (RetType){ case 1: // ASN_INTEGER32 // rezult = variableBindings.list[i].value.asnValue.number; len = wsprintf ((char *) rezstr, '%d', variableBindings.list[0].value.asnValue.number); break; case 2: // // rezult = variableBindings.list[i].value.asnValue.unsigned32; len = wsprintf ((char *) rezstr, '%d', variableBindings.list[0].value.asnValue.unsigned32); break; case 3: len = 4; CopyMemory((char *) rezstr,'9993',len); break; case 4: // ASN_OCTETSTRING len = variableBindings.list[0].value.asnValue.string.length; if ((variableBindings.list[0].value.asnValue.string.stream[0] >> 4) > 0) { for (j=0; j < len; j++) { rezult += sprintf(rezstr + rezult,'%c',variableBindings.list[0].value.asnValue.string.stream[j]); } } else { for (j=0; j < len; j++) { rezult += sprintf(rezstr + rezult,'%02x',variableBindings.list[0].value.asnValue.string.stream[j]); } } break; case 5: // ASN_NULL: len = variableBindings.list[0].value.asnValue.bits.length; // CopyMemory((char *)rezstr, //variableBindings.list[0].value.asnValue.bits.stream, len); strcpy(rezstr,variableBindings.list[0].value.asnValue.bits.stream); break; case 6: len = 4; CopyMemory((char *) rezstr,'9996',len); break; case 7: len = variableBindings.list[0].value.asnValue.sequence.length; // CopyMemory((char *)rezstr, //variableBindings.list[0].value.asnValue.sequence.stream, len); strcpy(rezstr,variableBindings.list[0].value.asnValue.sequence.stream); break; case 8: // len = variableBindings.list[0].value.asnValue.address.length; // CopyMemory((char *)rezstr, //variableBindings.list[0].value.asnValue.address.stream, len); strcpy(rezstr,variableBindings.list[0].value.asnValue.add
0
|
29.09.2010, 13:11 | |
Ответы с готовыми решениями:
1
Утечка памяти или что? Валидность итератора удаляется ли объект или происходит утечка памяти? Почему у массивов типа char может быть утечка памяти, а у указателей char с выделенной памятью - нет? TChart или утечка памяти? |
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
|
|
29.09.2010, 18:02 | 2 |
Первое что бросилось в глаза:
char oid[255]; char RetWhot[128]; char rezstr[255]; ......... if (rezstr) free(rezstr); if (RetWhot) free(RetWhot); if (abc) free(abc); Эти массивы нельзя убивать free,да и незачем. Вы же не убиваете такие массивы как char agent[128]; char community[64]; А, вот char *string как раз надо убивать,как ВЫ иделаете. Пока вроде всё.
0
|
29.09.2010, 18:02 | |
Помогаю со студенческими работами здесь
2
Утечка памяти или куда пропало =) Утечка памяти (или что-то еще) Cyberpunk 2077 Утечка памяти или что то другое ? Утечка памяти в программе , как избежать или как правильно уничтожить объект? HttpWebRequest, расход памяти непомерно больших объемов и , как следствие, утечка памяти Вектор, утечка памяти, функция создания и выделение памяти Обьясните хранятся ли ссылки в памяти или нет? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |