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