void
MemorySegmentLocal::deallocate(void* ptr, size_t size) {
+ if (ptr == NULL) {
+ // Return early if NULL is passed to be deallocated (without
+ // modifying allocated_size, or comparing against it).
+ return;
+ }
+
if (size > allocated_size_) {
isc_throw(OutOfRange, "Invalid size to deallocate: " << size
<< "; currently allocated size: " << allocated_size_);
EXPECT_THROW(segment->deallocate(ptr, 2048), isc::OutOfRange);
}
+TEST(MemorySegmentLocal, TestNullDeallocate) {
+ auto_ptr<MemorySegment> segment(new MemorySegmentLocal());
+
+ // By default, nothing is allocated.
+ EXPECT_TRUE(segment->allMemoryDeallocated());
+
+ // NULL deallocation is a no-op.
+ EXPECT_NO_THROW(segment->deallocate(NULL, 1024));
+
+ // This should still return true.
+ EXPECT_TRUE(segment->allMemoryDeallocated());
+}
+
} // anonymous namespace