• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/logging.h"
11 #include "base/macros.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_(NULL) {}
~ScopedCoMem()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 
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 {
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