1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2016 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.
6 #ifndef BITCOIN_SUPPORT_ALLOCATORS_SECURE_H
7 #define BITCOIN_SUPPORT_ALLOCATORS_SECURE_H
9 #include "support/lockedpool.h"
10 #include "support/cleanse.h"
15 // Allocator that locks its contents from being paged
16 // out of memory and clears its contents before deletion.
19 struct secure_allocator
: public std::allocator
<T
> {
20 // MSVC8 default copy constructor is broken
21 typedef std::allocator
<T
> base
;
22 typedef typename
base::size_type size_type
;
23 typedef typename
base::difference_type difference_type
;
24 typedef typename
base::pointer pointer
;
25 typedef typename
base::const_pointer const_pointer
;
26 typedef typename
base::reference reference
;
27 typedef typename
base::const_reference const_reference
;
28 typedef typename
base::value_type value_type
;
29 secure_allocator() noexcept
{}
30 secure_allocator(const secure_allocator
& a
) noexcept
: base(a
) {}
32 secure_allocator(const secure_allocator
<U
>& a
) noexcept
: base(a
)
35 ~secure_allocator() noexcept
{}
36 template <typename _Other
>
38 typedef secure_allocator
<_Other
> other
;
41 T
* allocate(std::size_t n
, const void* hint
= 0)
43 return static_cast<T
*>(LockedPoolManager::Instance().alloc(sizeof(T
) * n
));
46 void deallocate(T
* p
, std::size_t n
)
49 memory_cleanse(p
, sizeof(T
) * n
);
51 LockedPoolManager::Instance().free(p
);
55 // This is exactly like std::string, but with a custom allocator.
56 typedef std::basic_string
<char, std::char_traits
<char>, secure_allocator
<char> > SecureString
;
58 #endif // BITCOIN_SUPPORT_ALLOCATORS_SECURE_H