2010-08-10 3 views
1

비동기 에이전트 라이브러리 - 새로운 기능 중 하나를 사용하려고합니다. 방금 추가 한unbounded_buffer, _CrtSetDbgFlag 및 메모리 누수가

unbounded_buffer m_myDataBuffer; 내 C++ 클래스에 을 추가하면 더 이상 - 아직 실행중인 에이전트가 없습니다.

가, 내가 사용하고 내 응용 프로그램에서 메모리 누수 탐지를 활성화하려면 :

#ifdef _DEBUG 
    _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
#endif 

그러나 비주얼 스튜디오 메모리 누수의 무리를 보여줍니다 (I 간단 승 32 GUI 응용 프로그램을 사용하고 있습니다) 내 응용 프로그램 창을 닫은 후 :

Detected memory leaks! 

Dumping objects -> 
{261} normal block at 0x007C4EB8, 288 bytes long. 
Data: <    5 > 00 00 02 00 02 00 00 00 10 02 00 00 10 B1 35 00 
{260} normal block at 0x007C4E70, 12 bytes long. 
Data: <  HM| > 00 00 00 00 00 02 00 00 48 4D 7C 00 
{259} normal block at 0x007C4E18, 28 bytes long. 
Data: <    > 00 00 00 00 CD CD CD CD 00 00 00 00 00 00 00 00 
{258} normal block at 0x0035AEF0, 28 bytes long. 
Data: <    > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{257} normal block at 0x007C4D48, 144 bytes long. 
Data: < U   > A4 C2 F4 55 CD CD CD CD 00 00 00 00 00 00 00 00 
{255} normal block at 0x007C0AB8, 16388 bytes long. 
Data: <    > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{254} normal block at 0x0035CF30, 12 bytes long. 
Data: <   | > 01 10 00 00 01 00 00 00 B8 0A 7C 00 
{253} normal block at 0x007C0978, 256 bytes long. 
Data: <    > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{252} normal block at 0x007C08A8, 148 bytes long. 
Data: < ! U   > 8C 21 F5 55 01 00 00 00 00 00 00 00 00 00 00 00 
{251} normal block at 0x0035FEB8, 256 bytes long. 
Data: <    > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{250} normal block at 0x0035FDE8, 148 bytes long. 
Data: < ! U   > 8C 21 F5 55 01 00 00 00 00 00 00 00 00 00 00 00 
{249} normal block at 0x007C0068, 2048 bytes long. 
Data: < 5    > A0 FD 35 00 CD CD CD CD CD CD CD CD CD CD CD CD 
{248} normal block at 0x0035FDA0, 12 bytes long. 
Data: <` 5   > 60 F9 35 00 00 00 00 00 FF FF FF FF 
{247} normal block at 0x0035F960, 1024 bytes long. 
Data: < 5 |   > E8 FD 35 00 A8 08 7C 00 00 00 00 00 00 00 00 00 
{246} normal block at 0x0035F8B8, 104 bytes long. 
Data: < 5 5   > 10 B1 35 00 98 D0 35 00 02 00 00 00 02 00 00 00 
{245} normal block at 0x0035F078, 2048 bytes long. 
Data: <0 5    > 30 F0 35 00 CD CD CD CD CD CD CD CD CD CD CD CD 
{244} normal block at 0x0035F030, 12 bytes long. 
Data: < 5   > F0 EB 35 00 00 00 00 00 FF FF FF FF 
{243} normal block at 0x0035EBF0, 1024 bytes long. 
Data: <    > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{242} normal block at 0x0035E3B0, 2048 bytes long. 
Data: <h 5    > 68 E3 35 00 CD CD CD CD CD CD CD CD CD CD CD CD 
{241} normal block at 0x0035E368, 12 bytes long. 
Data: <(5   > 28 DF 35 00 00 00 00 00 FF FF FF FF 
{240} normal block at 0x0035DF28, 1024 bytes long. 
Data: <    > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{239} normal block at 0x0035DE08, 224 bytes long. 
Data: < U  5  > 98 13 F5 55 00 00 00 00 0C DE 35 00 00 00 00 00 
{238} normal block at 0x0035D5C8, 2048 bytes long. 
Data: < 5    > 80 D5 35 00 CD CD CD CD CD CD CD CD CD CD CD CD 
{237} normal block at 0x0035D580, 12 bytes long. 
Data: <@ 5   > 40 D1 35 00 00 00 00 00 FF FF FF FF 
{236} normal block at 0x0035D140, 1024 bytes long. 
Data: < 5    > 08 DE 35 00 00 00 00 00 00 00 00 00 00 00 00 00 
{235} normal block at 0x0035D098, 104 bytes long. 
Data: < 5 5 5  > 10 B1 35 00 B8 F8 35 00 08 DE 35 00 CD CD CD CD 
{234} normal block at 0x0035D008, 80 bytes long. 
Data: <, U\ U  > 2C C4 F4 55 5C C1 F4 55 00 00 00 00 00 00 00 00 
{233} normal block at 0x0035CF78, 80 bytes long. 
Data: <, U\ U  > 2C C4 F4 55 5C C1 F4 55 00 00 00 00 00 00 00 00 
{231} normal block at 0x0035CEF0, 4 bytes long. 
Data: < > 00 00 00 00 
{230} normal block at 0x0035CE58, 88 bytes long. 
Data: <   | 5 > 01 00 00 00 00 00 00 00 01 00 00 00 7C CF 35 00 
{229} normal block at 0x0035C300, 44 bytes long. 
Data: <    > 03 00 00 00 02 00 00 00 02 00 00 00 00 00 00 00 
{228} normal block at 0x0035C5E0, 2104 bytes long. 
Data: <    > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{227} normal block at 0x0035C4D0, 208 bytes long. 
Data: <l U  5 0 5 > 6C 0A F5 55 00 00 00 00 E8 C0 35 00 30 C1 35 00 
{225} normal block at 0x0035C2C0, 4 bytes long. 
Data: <5> B8 F8 35 00 
{224} normal block at 0x0035C280, 4 bytes long. 
Data: <5> 98 D0 35 00 
{223} normal block at 0x0035C200, 64 bytes long. 
Data: < 5    > 10 C5 35 00 CD CD CD CD CD CD CD CD CD CD CD CD 
{222} normal block at 0x0035C488, 8 bytes long. 
Data: <  > 00 00 00 00 01 00 00 00 
{221} normal block at 0x0035C418, 48 bytes long. 
Data: <    > 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 
{220} normal block at 0x0035C3D8, 4 bytes long. 
Data: < > 00 00 00 00 
{219} normal block at 0x0035C378, 36 bytes long. 
Data: <    > 03 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 
{217} normal block at 0x0035C130, 148 bytes long. 
Data: <l U   > 6C D7 F4 55 02 00 00 00 01 00 00 00 10 00 00 00 
{216} normal block at 0x0035C0E8, 8 bytes long. 
Data: < U 5 > C0 11 F5 55 10 B1 35 00 
{215} normal block at 0x0035B8A8, 2048 bytes long. 
Data: < 5    > 00 AE 35 00 CD CD CD CD CD CD CD CD CD CD CD CD 
{214} normal block at 0x0035AE00, 12 bytes long. 
Data: <h 5   > 68 B4 35 00 00 00 00 00 FF FF FF FF 
{213} normal block at 0x0035B468, 1024 bytes long. 
Data: < N|    > 18 4E 7C 00 00 00 00 00 00 00 00 00 00 00 00 00 
{212} normal block at 0x0035AF50, 36 bytes long. 
Data: <    > 00 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 
{211} normal block at 0x0035B110, 368 bytes long. 
Data: < UP 5   > CC 1D F5 55 50 AF 35 00 00 00 00 00 00 00 00 00 
Object dump complete. 

누출 내가

unbounded_buffer<int> m_myDataBuffer; 

을 주석 직후 사라 또는 내가 주석 처리 한 후

_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 

unbounded_buffer에 특별한 것이 있습니까? 사용하지 않아도 해제해야합니까? 또는 _CrtSetDbgFlag를 특별한 방법으로 설정해야합니까? _CrtSetDbgFlag가 mem 누수의 원인입니까 아니면이 경우 잘못된 검색을 생성하고 실제 메모리 누수가 없습니까? 내가 여기서 무엇을 놓치고 있니?

내 코드에서 메모리 누수가 파일 이름과 라인을 가지고, 그래서 나는 또한 내 STDAFX.H에서

#ifdef _DEBUG 
#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 
#define new new(_NORMAL_BLOCK,__FILE__, __LINE__) 

을 가지고 있기 때문에 그 누출 내 코드에서 오지 않는 것을 100 % 확신합니다. 하지만 unbounded_buffer에는 그러한 정보가 없으므로 에이전트 라이브러리에서 온 것입니다.

답변

0

좋아, _CRTDBG_LEAK_CHECK_DF 플래그가 _CrtDumpMemoryLeaks()의 자동 호출을 만든다는 것을 알았습니다. 신청서가 끝나면 그러나 그것은 최후에 일어나지 않고있는 것처럼 보입니다. _CRTDBG_LEAK_CHECK_DF를 제거하고 main()의 끝에서 _CrtDumpMemoryLeaks()를 호출하여 메모리 누수를 올바르게보고합니다.

또한 Microsoft MSDN에 PPL 라이브러리의 메모리 누수에 대한 버그 보고서가 있습니다. 곧 수정 될 수 있기를 바랍니다.

관련 문제