/* * This file is part of the Flowee project * Copyright (C) 2009-2010 Satoshi Nakamoto * Copyright (C) 2009-2015 The Bitcoin Core developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef FLOWEE_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H #define FLOWEE_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H #include "support/cleanse.h" #include #include template struct zero_after_free_allocator : public std::allocator { // MSVC8 default copy constructor is broken typedef std::allocator base; typedef typename base::size_type size_type; typedef typename base::difference_type difference_type; typedef typename base::pointer pointer; typedef typename base::const_pointer const_pointer; typedef typename base::reference reference; typedef typename base::const_reference const_reference; typedef typename base::value_type value_type; zero_after_free_allocator() throw() {} zero_after_free_allocator(const zero_after_free_allocator& a) throw() : base(a) {} template zero_after_free_allocator(const zero_after_free_allocator& a) throw() : base(a) { } ~zero_after_free_allocator() throw() {} template struct rebind { typedef zero_after_free_allocator<_Other> other; }; void deallocate(T* p, std::size_t n) { if (p != NULL) memory_cleanse(p, sizeof(T) * n); std::allocator::deallocate(p, n); } }; // Byte-vector that clears its contents before deletion. typedef std::vector > CSerializeData; #endif