/*
* 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