2017-11-10 1 views
2

VC20에서 VS2015 및 MFC를 사용하는 응용 프로그램에서 메모리 누수를 제거하려고합니다. 이 비슷한 질문에 대답은 도움이되지 않았다 : How to detect memory leak when memory allocation number isn't always same? 구성 속성> C/C++> 코드 생성에서VS2015 MFC에서 같은 메모리 누수가 발생해도 메모리 할당 번호가 계속 변경되는 이유는 무엇입니까?

, 나는/MTD에/MT에서 런타임 라이브러리에 대해 선택한 옵션을 변경했습니다.
응용 프로그램이 다중 스레드 (afaik)가 아닙니다.

프로그램 실행간에 메모리 할당 번호가 변경되어 코드의 다른 위치로 연결됩니다.
내가 사용한 절차는 이전에 잘 작동했습니다.
이전 메모리 누수 보고서에서 메모리 할당 번호를 복사하고 앱을 시작합니다.
중단 점에서 멈 추면 조사 식 창으로 이동하여 _crtBreakAlloc의 값 열에 붙여 넣습니다. (예 : _crtBreakAlloc 1171).
그런 다음 중단 될 때까지 프로그램을 실행하고 호출 스택을 사용하여 unfreed 개체를 찾습니다.

// Example of the memory report 
... 
{1171} client block at 0x088157A0, subtype c0, 224 bytes long. 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dumpcont.cpp(23) : atlTraceGeneral -  a ProgressBar object at $088157A0, 224 bytes long 
{223} normal block at 0x01E79600, 324 bytes long. 
Data: <    > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
... 

// Example of the next report 
... 
{1112} client block at 0x08B30480, subtype c0, 224 bytes long. 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dumpcont.cpp(23) : atlTraceGeneral - a ProgressBar object at $08B30480, 224 bytes long 
{223} normal block at 0x01F693D8, 324 bytes long. 
Data: <    > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
... 

메모리 할당 번호 "1171"이 "1112"로 변경되고 그 위에있는 모든 숫자에도 영향을줍니다.
VS2015 만 열린 상태에서 PC를 시작한 후에도 인접한 프로그램 실행 간에는 아무런 변화가 없습니다. 나는 매번 프로그램을 똑같은 순서로 똑같은 일을하면서 똑같은 순서로 유지합니다. 예. 어떤 도움이 아주 많이 이해할 수있을 것이다 has-

//stdafx.h 
#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 
#ifdef _DEBUG 
    #define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__) 
#else 
    #define DBG_NEW new 
#endif 

// CImage.h : main header file for the CImage application 
#define _CRTDBG_MAP_ALLOC // Supports memory leakage detection. 
#include <stdlib.h> 
#include <crtdbg.h> 
#ifdef _DEBUG 
    #ifndef DBG_NEW 
     #define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__) 
    #endif 
#endif 

코드, 운영자 새로운 매핑하려면 같은 버튼/키 등

을 누르면, 같은 파일을로드합니다. 고마워요

답변

1

많은 답변이 있습니다. 귀하가 제시 한 코드는 구체적이지 않습니다.

  1. 초기화 코드에 다른 스레드를 생성합니까? 실행 순서가 보장되지 않기 때문에 동작이 변경됩니다.
  2. 프로그램을 종료하면 UI는 대개 상태 (MFC-Next)도 저장합니다. 이 상태는 다시 시작할 때 다시로드됩니다. 다른 UI 설정으로 인해 문제가 발생할 수 있습니다.
  3. 다른 데이터입니다. 심지어 다른 명령 줄이나 다른 다른 입력 문자열을 CString 또는 std :: string 요소로 분리해도 교대가 발생할 수 있습니다. 왜냐하면 입력에 따라.
  4. 창을 만들 때조차 타이머 및 페인트 메시지가 발생하는시기에 따라 프로그램의 시작부터 시작까지 메시지 처리가 다를 수 있습니다.
  5. 나는 할당 수를 볼 때 매우 초기 단계 귀하의 경우

... 내가 놓친 ...이 목록 성장 할 수있는 다른 이유가 있다는 것을 확신합니다. 그리고 귀하의 질문에보고 된 개체 이름을보고, 나는 그것이 UI와 관련이 있다고 확신합니다.

따라서 프로그램의 모든 레지스트리 항목을 지우고 입력 데이터가 실제로 동일한 지 확인하는 것이 좋습니다.

조차도 초기 단계에서 코드에 침입하는 데 도움이됩니다. (i.E. 할당 1100).단계를 반복하고 코드에서 어떤 일이 일어나는지보십시오. 감시 창에서 할당 횟수를 봅니다.
많은 할당이 있으므로 몇 단계 만 거치면 코드를 빠르고 쉽게 찾을 수 있습니다.

+0

감사합니다. 명확하게 Q를 편집했습니다. (1) 아무 코드도 내 코드 (afaik)에서 생성되지 않습니다. (2,3) 각 실행에 대해 동일한 최소 일련의 동작을 반복합니다. (4) SetTimer()가 호출되지 않았습니다. 마지막으로, ".. 프로그램의 모든 레지스트리 항목을 지우십시오.", "감시 창에서 할당 수를 봅니다."라는 의미는 무엇입니까? ? – ArtH

+0

뜻. 브레이크 카운트를 발견 한 최소 카운트보다 작게 설정하십시오. MFC 코드를 코드에 추가하는 것보다 ... 출력 창의 데이터를 사용하면 누수를 일으키는 할당을 찾을 수 있습니다. – xMRi

+0

기계의 상황에 따라 처리가 다를 수 있기 때문에 ... – xMRi

관련 문제