Fix #399 MemoryPoolAllocator::Realloc expands fail
This commit is contained in:
parent
d43f001a36
commit
efe4140208
@ -194,6 +194,9 @@ public:
|
|||||||
if (newSize == 0)
|
if (newSize == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
originalSize = RAPIDJSON_ALIGN(originalSize);
|
||||||
|
newSize = RAPIDJSON_ALIGN(newSize);
|
||||||
|
|
||||||
// Do not shrink if new size is smaller than original
|
// Do not shrink if new size is smaller than original
|
||||||
if (originalSize >= newSize)
|
if (originalSize >= newSize)
|
||||||
return originalPtr;
|
return originalPtr;
|
||||||
@ -201,7 +204,6 @@ public:
|
|||||||
// Simply expand it if it is the last allocation and there is sufficient space
|
// Simply expand it if it is the last allocation and there is sufficient space
|
||||||
if (originalPtr == reinterpret_cast<char *>(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size - originalSize) {
|
if (originalPtr == reinterpret_cast<char *>(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size - originalSize) {
|
||||||
size_t increment = static_cast<size_t>(newSize - originalSize);
|
size_t increment = static_cast<size_t>(newSize - originalSize);
|
||||||
increment = RAPIDJSON_ALIGN(increment);
|
|
||||||
if (chunkHead_->size + increment <= chunkHead_->capacity) {
|
if (chunkHead_->size + increment <= chunkHead_->capacity) {
|
||||||
chunkHead_->size += increment;
|
chunkHead_->size += increment;
|
||||||
return originalPtr;
|
return originalPtr;
|
||||||
|
@ -81,3 +81,22 @@ TEST(Allocator, Alignment) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(Allocator, Issue399) {
|
||||||
|
MemoryPoolAllocator<> a;
|
||||||
|
void* p = a.Malloc(100);
|
||||||
|
void* q = a.Realloc(p, 100, 200);
|
||||||
|
EXPECT_EQ(p, q);
|
||||||
|
|
||||||
|
// exhuasive testing
|
||||||
|
for (size_t j = 1; j < 32; j++) {
|
||||||
|
a.Clear();
|
||||||
|
a.Malloc(j); // some unaligned size
|
||||||
|
p = a.Malloc(1);
|
||||||
|
for (size_t i = 1; i < 1024; i++) {
|
||||||
|
q = a.Realloc(p, i, i + 1);
|
||||||
|
EXPECT_EQ(p, q);
|
||||||
|
p = q;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user