소스 검색

Add extra check to prevent deletion of incomplete type in UniquePtr.

Eugene Kozlov 9 년 전
부모
커밋
eac08de5cb
1개의 변경된 파일11개의 추가작업 그리고 5개의 파일을 삭제
  1. 11 5
      Source/Urho3D/Container/Ptr.h

+ 11 - 5
Source/Urho3D/Container/Ptr.h

@@ -520,6 +520,15 @@ template <class T, class U> WeakPtr<T> DynamicCast(const WeakPtr<U>& ptr)
     return ret;
     return ret;
 }
 }
 
 
+/// Delete object of type T. T must be complete. See boost::checked_delete.
+template<class T> inline void CheckedDelete(T* x)
+{
+    // intentionally complex - simplification causes regressions
+    typedef char type_must_be_complete[sizeof(T) ? 1 : -1];
+    (void) sizeof(type_must_be_complete);
+    delete x;
+}
+
 /// Unique pointer template class.
 /// Unique pointer template class.
 template <class T> class UniquePtr
 template <class T> class UniquePtr
 {
 {
@@ -604,15 +613,12 @@ public:
     /// Reset.
     /// Reset.
     void Reset(T* ptr = 0)
     void Reset(T* ptr = 0)
     {
     {
-        if (ptr_)
-        {
-            delete ptr_;
-        }
+        CheckedDelete(ptr_);
         ptr_ = ptr;
         ptr_ = ptr;
     }
     }
 
 
     /// Return hash value for HashSet & HashMap.
     /// Return hash value for HashSet & HashMap.
-    unsigned ToHash() const { return static_cast<unsigned>((static_cast<size_t>(ptr_) / sizeof(T))); }
+    unsigned ToHash() const { return (unsigned)((size_t)ptr_ / sizeof(T)); }
 
 
     /// Destruct.
     /// Destruct.
     ~UniquePtr()
     ~UniquePtr()