1 // Copyright 2011 The Chromium Authors 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/check.h" 11 #include "base/memory/raw_ptr_exclusion.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: ScopedCoMem()25 ScopedCoMem() : mem_ptr_(nullptr) {} 26 27 ScopedCoMem(const ScopedCoMem&) = delete; 28 ScopedCoMem& operator=(const ScopedCoMem&) = delete; 29 ~ScopedCoMem()30 ~ScopedCoMem() { Reset(nullptr); } 31 32 T** operator&() { // NOLINT 33 DCHECK(mem_ptr_ == nullptr); // To catch memory leaks. 34 return &mem_ptr_; 35 } 36 37 operator T*() { return mem_ptr_; } 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 Reset(T * ptr)49 void Reset(T* ptr) { 50 if (mem_ptr_) 51 CoTaskMemFree(mem_ptr_); 52 mem_ptr_ = ptr; 53 } 54 get()55 T* get() const { return mem_ptr_; } 56 57 private: 58 // RAW_PTR_EXCLUSION: #addr-of, #union 59 RAW_PTR_EXCLUSION T* mem_ptr_; 60 }; 61 62 } // namespace win 63 } // namespace base 64 65 #endif // BASE_WIN_SCOPED_CO_MEM_H_ 66