2012-07-25 4 views
5

나는 T 타입의 "stuff"를 저장하는 템플릿 클래스 인 myFoo를 가지고 있는데, 원시 타입이거나 복잡한 타입을 가리키는 포인터 일 수 있습니다. myFoo가 삭제되면 저장되는 모든 것과 관련된 모든 메모리를 해제하려고합니다. 즉, 저장되는 모든 포인터에 대해 delete를 호출해야하지만 결국에는 프리미티브에서 delete를 호출 할 수도 있습니다. 이거 안전한가요 ??프리미티브에서 delete를 호출 할 수 있습니까?

나는 무엇이 진행되고 있는지 더 잘 강조하기 위해 아래 myFoo 스케치를 포함 시켰습니다. 소멸자의 동작이 잘 정의되어 있는지 확실하지 않습니다.

template<class T> 
class myFoo 
{ 
    public: 
     myFoo(int size) 
     { 
      size_ = size; 
      T* foo = new T[size_]; 
     } 

     void addFoo(T tmp, int index) 
     { 
      foo[index] = tmp; 
     } 

     virtual ~myFoo() 
     { 
      for(int i=0; i < size_; i++) 
      { 
       delete foo[i]; 
      } 
      delete [] foo; 
     } 

    private: 
     int size_; 
     T* foo; 
} 
+0

포인터를 전문으로 할 수 없습니까? – chris

+1

서면에 따르면, 코드는 * 의미있는 의미로 * 모든 * 유형 'T'에 대해 이해가되지 않습니다. 소유권 책임을 뒤섞어 쓰고 있으며 클래스는 유용성, 가독성 및 유지 보수성 악몽이 될 것입니다. 간단히 말해서, 그것은'T '가 무엇인지에 대한 당신의 우려가 아니어야하고, 클라이언트는 자신의 정리 작업을해야합니다 (물론 스마트 포인터를 사용해야합니다). –

+0

@KerrekSB : 나는 종류의 데이터베이스를 쓰고있다. 데이터를 삽입하고 싶습니다. 데이터베이스가 내부에 저장하고있는 물건의 메모리에 대한 소유권을 가져 오는 것이 합리적입니다. 그렇지 않으면 데이터베이스의 모든 데이터를 외부에서 관리해야합니다. 그것은 조금 "wtf ??" 네가 제안하는대로 해. – Daniel

답변

5

delete을 호출 할 수있는 유일한 방법은 포인터 유형입니다. 예를 들어, int에서 delete으로 전화하는 것은 오류입니다. 코드가 오류가되는 것을 시도하도록 템플릿을 정렬하면 컴파일러는 코드를 알리고 코드 컴파일을 거부합니다.

아니요, 포인터가 아닌 "실수로"삭제하는 것에 대해 걱정할 필요가 없습니다. 모든 원시 유형의

+0

그래서 내가 설명하는 행동을 어떻게 달성 할 수 있습니까? – Daniel

+0

포인터 저장 여부에 따라 다른 템플릿을 가질 수 있습니다. 또는 스마트 포인터 클래스의 인스턴스를 저장할 수 있으며 스마트 포인터의 소멸자를 사용하여 삭제 작업을 수행 할 수 있습니다. –

+0

그레그에게 감사드립니다. 나는 당신 (그리고 다른 사람들)이 똑똑한 포인터가 갈 길이라고 확신했다고 생각합니다. – Daniel

1

템플릿 전문

template <class T> struct delete_it; 

template <class T> struct delete_it<T*> 
{ 
    static void func(T* ptr) { delete ptr; } 
}; 

template <> struct delete_it<int> 
{ 
    static void func(int) {} 
}; 

template <> struct delete_it<double> 
{ 
    static void func(double) {} 
}; 

를 반복합니다. 그 다음

선택하지 않은 코드.