Add customization macros for global new/delete
As mentioned in #181, some environments may require adaptations to the internal calls to the global `new`/`delete` operators, like adding explicit `NULL` checks to `delete. This patch adds two new macros * RAPIDJSON_NEW(x) * RAPIDJSON_DELETE(x) to allow user-defined expressions in these cases. This fixes #181 in an alternative manner.
This commit is contained in:
parent
dea1cdca62
commit
c557b230a6
@ -105,7 +105,7 @@ public:
|
|||||||
chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0)
|
chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0)
|
||||||
{
|
{
|
||||||
if (!baseAllocator_)
|
if (!baseAllocator_)
|
||||||
ownBaseAllocator_ = baseAllocator_ = new BaseAllocator();
|
ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator());
|
||||||
AddChunk(chunk_capacity_);
|
AddChunk(chunk_capacity_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +135,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
~MemoryPoolAllocator() {
|
~MemoryPoolAllocator() {
|
||||||
Clear();
|
Clear();
|
||||||
delete ownBaseAllocator_;
|
RAPIDJSON_DELETE(ownBaseAllocator_);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Deallocates all memory chunks, excluding the user-supplied buffer.
|
//! Deallocates all memory chunks, excluding the user-supplied buffer.
|
||||||
|
@ -1634,7 +1634,7 @@ public:
|
|||||||
allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
|
allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
|
||||||
{
|
{
|
||||||
if (!allocator_)
|
if (!allocator_)
|
||||||
ownAllocator_ = allocator_ = new Allocator();
|
ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
|
||||||
}
|
}
|
||||||
|
|
||||||
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
|
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
|
||||||
@ -1875,7 +1875,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Destroy() {
|
void Destroy() {
|
||||||
delete ownAllocator_;
|
RAPIDJSON_DELETE(ownAllocator_);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const size_t kDefaultStackCapacity = 1024;
|
static const size_t kDefaultStackCapacity = 1024;
|
||||||
|
@ -38,7 +38,7 @@ public:
|
|||||||
Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) {
|
Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) {
|
||||||
RAPIDJSON_ASSERT(stackCapacity > 0);
|
RAPIDJSON_ASSERT(stackCapacity > 0);
|
||||||
if (!allocator_)
|
if (!allocator_)
|
||||||
ownAllocator = allocator_ = new Allocator();
|
ownAllocator = allocator_ = RAPIDJSON_NEW(Allocator());
|
||||||
}
|
}
|
||||||
|
|
||||||
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
|
#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
|
||||||
@ -162,7 +162,7 @@ private:
|
|||||||
|
|
||||||
void Destroy() {
|
void Destroy() {
|
||||||
Allocator::Free(stack_);
|
Allocator::Free(stack_);
|
||||||
delete ownAllocator; // Only delete if it is owned by the stack
|
RAPIDJSON_DELETE(ownAllocator); // Only delete if it is owned by the stack
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prohibit copy constructor & assignment operator.
|
// Prohibit copy constructor & assignment operator.
|
||||||
|
@ -400,6 +400,18 @@ template<int x> struct StaticAssertTest {};
|
|||||||
|
|
||||||
//!@endcond
|
//!@endcond
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// new/delete
|
||||||
|
|
||||||
|
#ifndef RAPIDJSON_NEW
|
||||||
|
///! customization point for global \c new
|
||||||
|
#define RAPIDJSON_NEW(x) new x
|
||||||
|
#endif
|
||||||
|
#ifndef RAPIDJSON_DELETE
|
||||||
|
///! customization point for global \c delete
|
||||||
|
#define RAPIDJSON_DELETE(x) delete x
|
||||||
|
#endif
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Allocators and Encodings
|
// Allocators and Encodings
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user