diff --git a/include/rapidjson/allocators.h b/include/rapidjson/allocators.h index d3dcb12..d68b74c 100644 --- a/include/rapidjson/allocators.h +++ b/include/rapidjson/allocators.h @@ -62,7 +62,12 @@ concept Allocator { class CrtAllocator { public: static const bool kNeedFree = true; - void* Malloc(size_t size) { return std::malloc(size); } + void* Malloc(size_t size) { + if (size) // behavior of malloc(0) is implementation defined. + return std::malloc(size); + else + return NULL; // standardize to returning NULL. + } void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { (void)originalSize; return std::realloc(originalPtr, newSize); } static void Free(void *ptr) { std::free(ptr); } }; diff --git a/test/unittest/allocatorstest.cpp b/test/unittest/allocatorstest.cpp index 774bf9b..1dba812 100644 --- a/test/unittest/allocatorstest.cpp +++ b/test/unittest/allocatorstest.cpp @@ -26,6 +26,8 @@ using namespace rapidjson; template void TestAllocator(Allocator& a) { + EXPECT_TRUE(a.Malloc(0) == 0); + uint8_t* p = (uint8_t*)a.Malloc(100); EXPECT_TRUE(p != 0); for (size_t i = 0; i < 100; i++)