summaryrefslogtreecommitdiffhomepage
path: root/dev/lib/memory
diff options
context:
space:
mode:
Diffstat (limited to 'dev/lib/memory')
-rw-r--r--dev/lib/memory/tracked_ptr.hpp23
1 files changed, 22 insertions, 1 deletions
diff --git a/dev/lib/memory/tracked_ptr.hpp b/dev/lib/memory/tracked_ptr.hpp
index b7e55f7..1ff4cca 100644
--- a/dev/lib/memory/tracked_ptr.hpp
+++ b/dev/lib/memory/tracked_ptr.hpp
@@ -31,6 +31,13 @@ namespace snu::memory
std::atomic<size_t> deallocated_count_ = 0;
public:
+ explicit tracked_allocator() = default;
+ virtual ~tracked_allocator() = default;
+
+ tracked_allocator& operator=(const tracked_allocator&) = default;
+ tracked_allocator(const tracked_allocator&) = default;
+
+ public:
template <typename... U>
void retain(T*& ptr, U&&... args)
{
@@ -68,6 +75,13 @@ namespace snu::memory
tracked_allocator<T> allocator_;
public:
+ explicit tracked_mgr() = default;
+ virtual ~tracked_mgr() = default;
+
+ tracked_mgr& operator=(const tracked_mgr&) = default;
+ tracked_mgr(const tracked_mgr&) = default;
+
+ public:
const tracked_allocator<T>& allocator() noexcept
{
return allocator_;
@@ -105,7 +119,7 @@ namespace snu::memory
ptr_ = tracked_ptr::manager().retain(std::forward<U>(args)...);
}
- ~tracked_ptr() noexcept
+ virtual ~tracked_ptr() noexcept
{
this->reset();
}
@@ -192,4 +206,11 @@ namespace snu::memory
{
a.swap(b);
}
+
+ /// @brief a Must Pass function is a standard way to verify a container' validity, inspired from NeKernel/VMKernel.
+ template <typename T>
+ inline void must_pass(tracked_ptr<T>& ptr) noexcept
+ {
+ assert(ptr.manager().allocator().allocated_count_ < ptr.manager().allocator().deallocated_count_);
+ }
} // namespace snu::memory \ No newline at end of file