내 Windows 7 상자에서이 간단한 프로그램을 사용하면 응용 프로그램의 메모리 사용이 상한없이 지속적으로 위로 올라갑니다. 필자는 필수적이지 않은 모든 것을 제거했으며 Microsoft Iphlpapi 함수 "GetIpAddrTable()"이 범인임을 분명히합니다. 각 호출에서 일부 메모리가 누수됩니다. 루프 (예 : 네트워크 인터페이스 목록의 변경 사항 확인)에서는 지속될 수 없습니다. 이 작업을 수행 할 수있는 비동기 알림 API가없는 것 같습니다. 이제이 논리를 별도의 프로세스로 분리하고 주기적으로 프로세스를 재활용해야하는 상황에 직면했습니다. 추악한 솔루션입니다.GetIpAddrTable()에서 메모리가 누수됩니다. 어떻게 해결할 수 있습니까?
아이디어가 있으십니까? 당신은 전체 if
블록과 sleep
을 주석 처리하면 그냥 완성도를 위해서
// IphlpLeak.cpp - demonstrates that GetIpAddrTable leaks memory internally: run this and watch
// the memory use of the app climb up continuously with no upper bound.
#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <Iphlpapi.h>
#pragma comment(lib,"Iphlpapi.lib")
void testLeak() {
static unsigned char buf[16384];
DWORD dwSize(sizeof(buf));
if (GetIpAddrTable((PMIB_IPADDRTABLE)buf, &dwSize, false) == ERROR_INSUFFICIENT_BUFFER)
{
assert(0); // we never hit this branch.
return;
}
}
int main(int argc, char* argv[]) {
for (int i = 0; true; i++) {
testLeak();
printf("i=%d\n",i);
Sleep(1000);
}
return 0;
}
감사합니다. 예, GetIpAddrTable 호출을 중지하면 코드 누수가 중지됩니다. 대체 리턴 코드를 확인하는 아이디어는 좋지만 프로덕션 코드는이를 수행합니다. 누수가 지속됩니다. 마이크로 소프트에 통보하는 것에 관해서는 ... 음, 나는 그렇게 할 공동체의 의무가 있다고 생각하지만, 제품을 출하 할 수 있도록 내 문제를 해결한다는 측면에서 볼 때 실용적이지 않습니다. 기어를 완전히 전환하려고 생각합니다. gethostname()을 호출 한 다음 gethostbyname()을 호출하여 해당 이름에 바인딩 된 IP 목록을 검색합니다. 이 자극적 인 수수께끼를 남겨 두지 만 충분해야합니다. – Stabledog