2011-12-17 2 views
-1

을 삭제 한 후 만약 내가 가지고있는 다음과 같은 클래스 :메모리 누수 템플릿 클래스

// ComponentMan.h 
class ComponentMan 
{ 
public: 
    template<class T> 
    void CreateComponent<T>() 
    { 
     T* temp = new T(); 
     delete temp; // Memory leak? 
    } 
} 
  • 가 삭제 온도는 메모리 누수가 발생할합니까?
  • 프로그램이 T의 크기를 모르기 때문에?
  • 그렇다면 어떻게 피할 수 있습니까? 프로그램 temp 크기를 알고 있기 때문에
+2

아니요. 그렇습니다. N/A. –

+1

개체 크기를 모르는 경우 어떻게 처음에 'new'를 처리 할 수 ​​있습니까? – Mat

+0

@BenjaminLindley : 답을해야합니다! –

답변

1

의 유형을 알고, 컴파일러는 하지이 개체의 크기가 temp가 가리키는 알고 않지만, '아무튼 알 필요가 없으므로 누수가 없습니다. 예를 들어 :

struct T { int t; }; 
struct U : public T { int u; }; 
T * temp = new U(); 
delete temp; // compiler doesn't know whether it's dealing with a T or a U 

지금은 C++ 잊어, 단순히 우리가 int 치의 컴파일러 얼마나 큰 우리의 배열을 상기하지 않더라도, C.이 C 코드가 작동

int * ptr = malloc(100); 
free(ptr); 

을 고려 였다.

(편집 : 여기서 삭제 시간에 대해 이야기하고 있음을 명확히하기 위해 컴파일러는 삭제 시간보다 작성 시간을 더 많이 알고 있습니다. "시스템은 삭제 시간에 얼마나 많은 메모리를 알 수 있습니까? 하나의 대답은 http://c-faq.com/malloc/freesize.html입니다.

3

그것은, 여기에는 메모리 누수가 없다. 컴파일러 대신 컴파일 시간에 실제 유형 PARAMS을 템플릿, 그래서 프로그램이 실행될 때 정확히 삭제시 temp

+0

실제로 컴파일러는 크기를 알지 못합니다. 그러나 크기를 알 필요는 없습니다. 메모리가 낮은 수준에서 어떻게 처리되는지에 대한 질문입니다. 예를 들어'T * temp = new U();'U가 T를 확장하면 'delete temp;'는 T 또는 U를 처리하는지 여부를 알 수 없습니다. –

+0

명시 적으로 'delete'-ing이 컴파일러가 knwing 크기없이 작업 할 수 있다는 것을 의미하지는 않습니다. 컴파일러는 객체의 _allocate_ 메모리 크기를 알아야합니다. – Lol4t0

+0

질문은 삭제에 대해 묻고, 삭제 코드가 크기를 어떻게 알 수 있는지 묻습니다. 이 질문은 창조물이 어떻게 그 크기를 아는지 묻지 않습니다. –