zeroafterfree.h raw

   1  // Copyright (c) 2009-2010 Satoshi Nakamoto
   2  // Copyright (c) 2009-present The Bitcoin Core developers
   3  // Distributed under the MIT software license, see the accompanying
   4  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   5  
   6  #ifndef BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H
   7  #define BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H
   8  
   9  #include <support/cleanse.h>
  10  
  11  #include <memory>
  12  #include <vector>
  13  
  14  template <typename T>
  15  struct zero_after_free_allocator {
  16      using value_type = T;
  17  
  18      zero_after_free_allocator() noexcept = default;
  19      template <typename U>
  20      zero_after_free_allocator(const zero_after_free_allocator<U>&) noexcept
  21      {
  22      }
  23  
  24      T* allocate(std::size_t n)
  25      {
  26          return std::allocator<T>{}.allocate(n);
  27      }
  28  
  29      void deallocate(T* p, std::size_t n)
  30      {
  31          if (p != nullptr)
  32              memory_cleanse(p, sizeof(T) * n);
  33          std::allocator<T>{}.deallocate(p, n);
  34      }
  35  
  36      template <typename U>
  37      friend bool operator==(const zero_after_free_allocator&, const zero_after_free_allocator<U>&) noexcept
  38      {
  39          return true;
  40      }
  41  };
  42  
  43  /** Byte-vector that clears its contents before deletion. */
  44  using SerializeData = std::vector<std::byte, zero_after_free_allocator<std::byte>>;
  45  
  46  #endif // BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H
  47