Line data Source code
1 : // Copyright (c) 2009-2010 Satoshi Nakamoto
2 : // Copyright (c) 2009-2013 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 : public std::allocator<T> {
16 : // MSVC8 default copy constructor is broken
17 : typedef std::allocator<T> base;
18 : typedef typename base::size_type size_type;
19 : typedef typename base::difference_type difference_type;
20 : typedef typename base::pointer pointer;
21 : typedef typename base::const_pointer const_pointer;
22 : typedef typename base::reference reference;
23 : typedef typename base::const_reference const_reference;
24 : typedef typename base::value_type value_type;
25 202253 : zero_after_free_allocator() throw() {}
26 101553 : zero_after_free_allocator(const zero_after_free_allocator& a) throw() : base(a) {}
27 : template <typename U>
28 : zero_after_free_allocator(const zero_after_free_allocator<U>& a) throw() : base(a)
29 : {
30 : }
31 307054 : ~zero_after_free_allocator() throw() {}
32 : template <typename _Other>
33 : struct rebind {
34 : typedef zero_after_free_allocator<_Other> other;
35 : };
36 :
37 243064 : void deallocate(T* p, std::size_t n)
38 : {
39 243064 : if (p != NULL)
40 243064 : memory_cleanse(p, sizeof(T) * n);
41 243062 : std::allocator<T>::deallocate(p, n);
42 243063 : }
43 : };
44 :
45 : // Byte-vector that clears its contents before deletion.
46 : typedef std::vector<char, zero_after_free_allocator<char> > CSerializeData;
47 :
48 : #endif // BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H
|