xref: /aosp_15_r20/external/cronet/base/win/scoped_co_mem.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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