2012-05-11 4 views
0
여기

은 몇 가지 예제 코드입니다 :_CrtMemDumpAllObjectsSince() 함수는 누수를 감지 할 수없는 대신이라고 삭제 배열을 삭제하면 [] 배열

#include <crtdbg.h> 
#include <windows.h> 

#ifdef _DEBUG 
#define new DEBUG_CLIENTBLOCK 
#endif 

int main() 
{ 
    int* arr = new int[10]; 
    delete arr;  //not using delete [] arr 
    _CrtMemDumpAllObjectsSince(NULL); // dumping leak logs 


    return 0; 
} 

당신은 내가 delete [] arr을 사용하지 않은 것을 볼 수 있듯이 아직도 내가 그랬어 누출은 없어.

누구나 그것을 교정하고 이유를 설명해주십시오. _CrtMemDumpAllObjectsSince()은 위의 코드에서 누출을 덤프하지 않습니다.

답변

3

delete을 페어링하면 정의되지 않은 동작이 발생하므로 그 이후부터 유용하게 사용할 수있는 것은 의지 할 수 없습니다. 일반적으로 더 도움이

비공식 대답은 당신이 (deletenew[])이 작업을 수행 할 때 무엇을 일반적으로 발생하는 메모리 블록이 소멸자의 개체에서 호출되지 않는 힙, 하지만에 반환됩니다 있다는 점이다 배열 즉, 해당 오브젝트가 올바르게 소멸되지 않습니다 (). 점유 된 메모리가 해제됩니다. 메모리 블록이 해제되었고 dtors에 대한 지식이 없기 때문에 _CrtMemDumpAllObjectsSince()은 아무런 문제가 없습니다. 당신이 실제로 (대신 delete stuff;delete [] stuff;를 사용하는 경우, 빠른 검사를하고, 그대로이 아마 메모리 누수가됩니다

class stupid { 
    char *junk; 
public: 
    stupid() { junk = new char[10]; } 
    ~stupid() { delete [] junk; } 
}; 

int main() { 
    stupid *stuff = new stupid[10]; 

    delete stuff; 
    // delete [] stuff; 
    _CrtMemDumpAllObjectsSince(NULL); 
    return 0; 
} 

하지만, 누출 종료하십시오 한편

,이 같은 것을 고려 나는 적어도 나를 위해 그것을 밖으로 플랫 - 아웃 충돌, 그래서 당신은 여전히 ​​누출 보고서를 얻을 수 없습니다,하지만 당신은 분명히 뭔가 잘못 알고 서둘러 찾을거야).

+0

제리에게 감사드립니다. 나는 당신의 예제에서 프로그램이 왜 충돌하는지에 대해 한 가지 더 의심스러워합니다. 내가 경고를 받았지만 뭔가 잘못되었다 ... –

+1

@ShashankJain : 솔직히 모르겠다 - 나는 그것을 실행하기를 기대했지만 메모리 누출을 일으킨다. 나는 앞으로 일어나는 일이 무엇인지 알아내는 것이 중요하지 않을까 의심 스럽다. 그리고 나는 왜 그런 일이 일어나고 있는지를 알기 위해 많은 시간을 할애하지 않을 것이다. 특히 더 이상 전혀 새로운 것을 사용하지 않기 때문이다. 하지 않은 년). –

0

배열에 사용 된 Visual C++ 삭제 연산자가 예기치 않은 결과를 나타내는 것으로 설명되어 있습니다. 왜냐하면 각 요소의 int 배열은 파괴되지 않으면 부작용이 없으므로 메모리가 올바르게 해제되고 있기 때문입니다.

각 개체가 자체 메모리를 할당하고 소멸자에서 해제하는 사용자 정의 형식의 배열을 사용하여 동일한 작업을 수행하십시오. 나는 당신이 다른 결과를 가질 것이라고 믿습니다.