Home | History | Annotate | Download | only in win
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef BASE_WIN_SCOPED_CO_MEM_H_
      6 #define BASE_WIN_SCOPED_CO_MEM_H_
      7 
      8 #include <objbase.h>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/logging.h"
     12 
     13 namespace base {
     14 namespace win {
     15 
     16 // Simple scoped memory releaser class for COM allocated memory.
     17 // Example:
     18 //   base::win::ScopedCoMem<ITEMIDLIST> file_item;
     19 //   SHGetSomeInfo(&file_item, ...);
     20 //   ...
     21 //   return;  <-- memory released
     22 template<typename T>
     23 class ScopedCoMem {
     24  public:
     25   ScopedCoMem() : mem_ptr_(NULL) {}
     26   ~ScopedCoMem() {
     27     Reset(NULL);
     28   }
     29 
     30   T** operator&() {  // NOLINT
     31     DCHECK(mem_ptr_ == NULL);  // To catch memory leaks.
     32     return &mem_ptr_;
     33   }
     34 
     35   operator T*() {
     36     return mem_ptr_;
     37   }
     38 
     39   T* operator->() {
     40     DCHECK(mem_ptr_ != NULL);
     41     return mem_ptr_;
     42   }
     43 
     44   const T* operator->() const {
     45     DCHECK(mem_ptr_ != NULL);
     46     return mem_ptr_;
     47   }
     48 
     49   void Reset(T* ptr) {
     50     if (mem_ptr_)
     51       CoTaskMemFree(mem_ptr_);
     52     mem_ptr_ = ptr;
     53   }
     54 
     55   T* get() const {
     56     return mem_ptr_;
     57   }
     58 
     59  private:
     60   T* mem_ptr_;
     61 
     62   DISALLOW_COPY_AND_ASSIGN(ScopedCoMem);
     63 };
     64 
     65 }  // namespace win
     66 }  // namespace base
     67 
     68 #endif  // BASE_WIN_SCOPED_CO_MEM_H_
     69