diff --git a/include/cista/buffer.h b/include/cista/buffer.h index 9a32c1cf..1d8f5758 100644 --- a/include/cista/buffer.h +++ b/include/cista/buffer.h @@ -24,10 +24,7 @@ struct buffer final { std::memcpy(buf_, str, size_); } - ~buffer() { - std::free(buf_); - buf_ = nullptr; - } + ~buffer() { free(); } buffer(buffer const&) = delete; buffer& operator=(buffer const&) = delete; @@ -43,7 +40,7 @@ struct buffer final { return *this; } if (buf_ != nullptr) { - std::free(buf_); + free(); } buf_ = o.buf_; size_ = o.size_; @@ -74,6 +71,13 @@ struct buffer final { size_ = 0U; } + void free() noexcept { + if (buf_ != nullptr) { + std::free(buf_); + reset(); + } + } + void* buf_; std::size_t size_; }; diff --git a/include/cista/memory_holder.h b/include/cista/memory_holder.h index 660e1344..840c3752 100755 --- a/include/cista/memory_holder.h +++ b/include/cista/memory_holder.h @@ -19,6 +19,15 @@ struct wrapped { } explicit wrapped(raw::unique_ptr el) : el_{std::move(el)} {} + void reset() { + el_->~T(); + if (std::holds_alternative(mem_)) { + std::get(mem_) = buffer{}; + } else if (std::holds_alternative(mem_)) { + std::get(mem_) = byte_buf{}; + } + } + friend bool operator==(wrapped const& x, std::nullptr_t) { return x.el_ == nullptr; }