2012-04-01 2 views
0
class finder 
{ 
    public: 
     finder(); 
     ~finder(); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    finder* pfind = new finder(L"test"); 
    finder find(L"test2"); 
    system("PAUSE"); 
    return 0; 
} 

find의 소멸자는 프로그램 종료 후에 호출되지만 pfind의 소멸자는 호출되지 않습니다. 내 질문은 왜? 추가해야합니까?개체 및 해당 소멸자에 대한 포인터

delete _pfind; 

return 0?

+0

'delete'를 추가하면 안됩니다.'new'를 제거해야합니다. – avakar

+1

코드에 오류가 가득합니다. 스 니펫을 올리려면 가능한 한 올바른 것으로 만들어야합니다. – meagar

+1

@avakar'new'와'delete'에 대해 배우는 데는 아무런 문제가 없습니다. 물론 당신이 그들을 좋아하지 않는다면 그들을 피할 수있는 방법을 찾을 수 있습니다. 그러나 실제로 그들을 사용하고 그들과 함께 편안하게하고 실수로부터 배우고 당신이 좋아하는지 아닌지를 결정하는 데는 아무런 문제가 없습니다. –

답변

3

"이유"란 사용자가 생성 한 개체의 수명을 new (으)로 관리해야하기 때문입니다.

자동 저장 기간 (예 : find)이있는 객체는 생성 된 블록만큼 오래 유지됩니다. 이러한 항목은 적절한 시간에 (즉, 일반적으로 사용자가 해당 블록을 떠날 때 자동으로 삭제됩니다.)

삭제할 때까지 동적 저장 기간 개체 (예 : pfind)가 마지막으로 사용됩니다. 아무것도 삭제하지 않습니다.

그래,이 경우 직접 삭제해야합니다 (delete pfind;).

(또는 사용 사례에 대한 스마트 포인터의 적절한 유형을 사용합니다.)

1

예, 명시 적으로 관리되지 않는 포인터에 delete를 호출하여 당신이 할당 된 메모리를 정리해야합니다. 일반적으로 new을 통해 메모리를 할당하는 모든 코드 블록은 delete을 통해 해당 메모리를 할당 해제하는 코드 블록과 균형을 이루어야합니다.

0

매트가 맞지만 CLR/.Net C++ (요즘은 무엇이든)를 사용하고있는 것으로 나타났습니다. 나는 gcnew 키워드를 가지고 있다고 믿는다.이 키워드는 new 키워드와 같은 일을 할 것이지만 그 범위의 끝에있는 객체를 삭제한다. 이를 가비지 수집이라고도합니다. newgcnew을 모두 가지고있는 개인 메모는 서로 다른 상황에 잘 맞기 때문에 훌륭한 도구입니다. 코드 gcnew을 사용하는 경우 크로스 플랫폼이 아니므로 유의하시기 바랍니다.