diff --git a/include/libpmr/small_storage.h b/include/libpmr/small_storage.h index b2e3a8a..317b7a9 100644 --- a/include/libpmr/small_storage.h +++ b/include/libpmr/small_storage.h @@ -283,7 +283,7 @@ class holder : public holder_base { public: template static std::size_t full_sizeof(std::size_t count) noexcept { - return offsetof(holder, info_) + detail::full_sizeof(count); + return sizeof(holder) - sizeof(info_) + detail::full_sizeof(count); } holder() noexcept diff --git a/test/pmr/test_pmr_small_storage.cpp b/test/pmr/test_pmr_small_storage.cpp index 34c2a44..3fae621 100644 --- a/test/pmr/test_pmr_small_storage.cpp +++ b/test/pmr/test_pmr_small_storage.cpp @@ -74,17 +74,24 @@ TEST(small_storage, holder_copy_move) { h5.destroy(alc); h6.destroy(alc); - pmr::holder h7(alc, ::LIBIMP::types{}, 10); - pmr::holder h8, h9; - h7.copy_to(alc, &h8); - EXPECT_EQ(h7.count(), 10); - EXPECT_EQ(h8.count(), 10); - h7.move_to(alc, &h9); - EXPECT_EQ(h7.count(), 0); - EXPECT_EQ(h9.count(), 10); - h7.destroy(alc); - h8.destroy(alc); - h9.destroy(alc); + void *ph1 = std::malloc(pmr::holder::full_sizeof(10)); + void *ph2 = std::malloc(pmr::holder::full_sizeof(10)); + void *ph3 = std::malloc(pmr::holder::full_sizeof(10)); + auto *h7 = ::new (ph1) pmr::holder(alc, ::LIBIMP::types{}, 10); + auto *h8 = ::new (ph2) pmr::holder; + auto *h9 = ::new (ph2) pmr::holder; + h7->copy_to(alc, h8); + EXPECT_EQ(h7->count(), 10); + EXPECT_EQ(h8->count(), 10); + h7->move_to(alc, h9); + EXPECT_EQ(h7->count(), 0); + EXPECT_EQ(h9->count(), 10); + h7->destroy(alc); + h8->destroy(alc); + h9->destroy(alc); + std::free(ph1); + std::free(ph2); + std::free(ph3); pmr::holder h10(alc, ::LIBIMP::types{}, 10); pmr::holder h11, h12;