重载C++ new和delete运算符时释放内存小于分配内存的原因
内存释放大小打印错误的原因分析
你的代码中,operator new能正确打印分配的内存大小,是因为它接收了编译器传入的size_t size参数——这个参数就是Person对象实际需要的内存空间(28字节,包含string成员和int成员的占用)。
但operator delete的实现存在关键错误:你用sizeof(p)来获取释放的内存大小。这里的p是void*类型,在32位系统中指针大小固定为4字节,所以打印的是指针本身的大小,而非实际释放的内存块大小。
修正方法
要正确打印释放的内存大小,需要重载带size_t参数的operator delete,编译器会自动把分配时的内存大小传递给这个参数:
class Person { // ... 其他成员保持不变 ... void operator delete(void* p, size_t size) { free(p); cout << "Free " << size << " bytes.\n"; } // 保留无参数版本以兼容部分场景(可选,但建议保留) void operator delete(void* p) { free(p); cout << "Free unknown size bytes.\n"; } };
修改后运行程序,输出会变为:
Allocate 28 bytes. Free 28 bytes.
内容的提问来源于stack exchange,提问作者ParsaAi
相关产品推荐
相关产品推荐

