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