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 13namespace base { 14namespace 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 22template<typename T> 23class 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 private: 56 T* mem_ptr_; 57 58 DISALLOW_COPY_AND_ASSIGN(ScopedCoMem); 59}; 60 61} // namespace win 62} // namespace base 63 64#endif // BASE_WIN_SCOPED_CO_MEM_H_ 65