You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重载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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:06:23