// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_WIN_SCOPED_CO_MEM_H_
#define BASE_WIN_SCOPED_CO_MEM_H_
#include <objbase.h>
#include "base/basictypes.h"
#include "base/logging.h"
namespace base {
namespace win {
// Simple scoped memory releaser class for COM allocated memory.
// Example:
// base::win::ScopedCoMem<ITEMIDLIST> file_item;
// SHGetSomeInfo(&file_item, ...);
// ...
// return; <-- memory released
template<typename T>
class ScopedCoMem {
public:
ScopedCoMem() : mem_ptr_(NULL) {}
~ScopedCoMem() {
Reset(NULL);
}
T** operator&() { // NOLINT
DCHECK(mem_ptr_ == NULL); // To catch memory leaks.
return &mem_ptr_;
}
operator T*() {
return mem_ptr_;
}
T* operator->() {
DCHECK(mem_ptr_ != NULL);
return mem_ptr_;
}
const T* operator->() const {
DCHECK(mem_ptr_ != NULL);
return mem_ptr_;
}
void Reset(T* ptr) {
if (mem_ptr_)
CoTaskMemFree(mem_ptr_);
mem_ptr_ = ptr;
}
T* get() const {
return mem_ptr_;
}
private:
T* mem_ptr_;
DISALLOW_COPY_AND_ASSIGN(ScopedCoMem);
};
} // namespace win
} // namespace base
#endif // BASE_WIN_SCOPED_CO_MEM_H_