2010-05-19 6 views
1

여러분, 사이트에 나타나는 간헐적 인 버그를 추적하려고합니다. 몇 가지 GDI 코드에서 필자가 함께 사용하여 집계 프린터를 작동시키는 느낌이 들었습니다.이 CDC를 삭제해야합니까?

필자는이 CDC를 삭제하는 방법에 대해 잘 알고 있지만 내 코드는 괜찮은 것처럼 보입니다.

// Create a device context for printing 
CDC* dc = new CDC(); 
    if(! dc->CreateDC(safeDriverName.AsBSTR(), safePrinterName.AsBSTR(), NULL, NULL)) 
{ 
    throw . . . 
} 

// as I finish with the CDC 
dc->DeleteDC(); 
delete dc; 

내가 dc->DeleteDC();delete dc가 필요하십니까?

감사

당신은 힙에 dc를 할당하기 때문에

답변

9

, 그래 당신은 dc을 삭제할 필요가 없습니다. 뿐만 아니라 당신이 가지고있는 코드를 유지한다면 던지기 전에 delete dc도 가져야합니다. DeleteDC 함수는 할당 된 메모리 dc과 관련이 없습니다.

는이 생각에 간단하게 수 :

// Create a device context for printing 
CDC dc; 
if(! dc.CreateDC(safeDriverName.AsBSTR(), safePrinterName.AsBSTR(), NULL, NULL)) 
{ 
    throw . . . 
} 

// as I finish with the CDC 
dc.DeleteDC(); 

업데이트 : @Fred가 언급 한 바와 같이는 CDC의 소멸자가 당신을 위해 DeleteDC()를 호출합니다.

+3

에 비해, 정신 나간 소리는이에 따라,'DeleteDC'를 호출 할 필요가 없습니다 http://msdn.microsoft.com/en-us/library/40y7h98e.aspx –

+0

@Fred : 감사합니다. –

+0

@Fred : @ 브라이언 : 고마워요. 나는 이걸 보면서 십자가에 달리기 시작했고, 내 이름은 확신하지 못했습니다. 추신 'delete * dc'는 dtor에서 발생하므로 예외가 발생하면 잡히게됩니다. 프레드, 링크 메이트에게 고마워. –

5

브라이언의 대답을 좋아합니다. 그러나 어떤 이유로 동적 할당이 바람직하다면 (스택 공간 문제, 아마도) 스마트 포인터를 사용하십시오. 아마 부스트 :: scoped_ptr를 선호 싶지만, auto_ptr은 충분 :

// Create a device context for printing 
auto_ptr<CDC> dc(new CDC()); 
    if(! dc->CreateDC(safeDriverName.AsBSTR(), safePrinterName.AsBSTR(), NULL, NULL)) 
{ 
    // dc is automatically cleaned up on the throw 
    throw . . . 
} 

// dc is automatically cleaned up at scope exit 
0

가 힙에 CDC 개체를 할당 스택 메모리를 저장 -이 말도 안돼! (가혹한 언어에 대한 나를 용서하십시오).

이 개체는 작은 개체입니다 (Win32 아키텍처의 경우). 그것은 단지 4 개의 "정수"변수입니다. 사실 HDC (하나의 "정수")로만 처리 할 수 ​​있지만 MFC의 래퍼에는 다른 이유로 3 가지 변수가 정의되어 있습니다.

불필요한 코드를 제외하고 힙에 메모리를 할당하면 심각한 성능 저하가 발생합니다. 또한 이것은 상당한 메모리 오버 헤드를 가지며, 또 다른 변수 (할당 된 메모리에 대한 포인터)가 필요합니다. 따라서 전체적으로 메모리가 낭비됩니다. 또한 동적으로 할당 된 데이터에 대한 포인터로 작업 할 때 실제로는 여분의 간접 참조가 있습니다.

할당 된 객체가 총 액세스 가능한 스택 크기와 비슷한 크기 인 경우 너무 많은 스택 메모리를 소비하는 것에 대해 걱정해야합니다. 예를 들어, 기본 스레드 스택 크기가 1MB 인 Win32에서 수십 KB의 개체를 할당하는 것에 대해 걱정할 필요가 있습니다. 또는 심도 깊은 재귀를 광범위하게 사용하면 걱정하지 않아도됩니다. (할당 된 모든 지역 변수에 재귀 수준이 곱해집니다.) "스택 메모리를 절약하기 위해"16 바이트를 할당

하지만 -이 끔찍한 성능 저하, 코드의 복잡성, 메모리 조각화 등

+0

사과,하지만 위의 예제는 간단합니다, CDC는 할당되어 개체의 수명 동안 유지되고 소멸자에서 삭제됩니다. –

+0

나는 auto_ptr (또는 scoped_ptr)을 사용하여 스택 메모리를 저장하는 개념에 동의한다. CDC와 같은 작은 래퍼 개체에 대해서는이 작업을 수행하는 것에 분명히 동의하지 않습니다. – valdo

+1

@valdo : Windows 사용자가 아니기 때문에 CDC가 얼마나 큰지 알지 못했습니다. 그리고 어쨌든, 저는 CDC를 위해 특별히 설득력을 발휘하지 못했지만 제 대답이 다른 사물에 의미가 있다고 생각했습니다. 네가 그 말에 동의하는 것처럼 들린다. 당신은 좋은 지적을합니다. –

관련 문제