2014-10-05 2 views
1

나는 다음과 같은 코드가 있습니다동적 데이터를 삭제할 필요가 없습니까?

class A { 
public: 
    virtual void f() { 
     cout << "1" << endl; 
    } 
}; 

class B : public A { 
public: 
    void f { 
     cout << "2" << endl; 
    } 
}; 

int main() { 
    A* a = new B(); 
    a->f(); 
    return 0; 
} 

을 그리고 내 질문은 : 메인 함수의 반환하기 전에 삭제 할 필요가없는 이유는 무엇입니까? 내 이해에 따르면이 코드는 메모리 누수가 발생합니다. 제가 잘못 생각합니까?

[업데이트] valgrind를 사용하여 다음 코드를 검사하면 더 혼란 스럽습니다. 메모리 누수가 있다고합니다.

+0

이 유형은 멤버 함수의 주소를 저장하므로 적어도 누구 에게라도 잘못했다고 말하고 싶습니다. – OMGtechy

+1

그것은 당신이 정리하지 않은 것만 큼 많은 누출이 아닙니다. 참조를 실제로 잊어 버리면 적절한 누출이됩니다. 만약 당신이'a = nullptr; '라고했다면. 누출은 언제나 좋지 않은 반면에, 끝내서 unreclaimed 한 것을 떠나는 것은 때때로 이루어집니다. –

답변

0

"내 이해에 따르면이 코드는 메모리 누수가 발생합니다. 잘못된 것입니까?"

아니오, 아니요 delete이 있어야합니다. OS가 return 0; 이후에 프로세스에서 할당 된 모든 메모리를 회수하기 때문에 일반적으로 메모리 누수는 중요하지 않지만.

1

참으로 메모리 누수가 있습니다. 그것은 main의 반환에서 프로그램의 출구까지 지속됩니다.이 경우는 매우 짧습니다.

관련 문제