zeroafterfree.h
1 // Copyright (c) 2009-2010 Satoshi Nakamoto 2 // Copyright (c) 2009-2022 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 template <typename U> 42 friend bool operator!=(const zero_after_free_allocator&, const zero_after_free_allocator<U>&) noexcept 43 { 44 return false; 45 } 46 }; 47 48 /** Byte-vector that clears its contents before deletion. */ 49 using SerializeData = std::vector<std::byte, zero_after_free_allocator<std::byte>>; 50 51 #endif // BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H