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

C++中带size_t参数的delete运算符重载:sz参数值来源探究

问题解答:重载operator delete时sz参数的赋值位置

示例代码

#include <iostream>
#include <stdlib.h>
using namespace std;

struct P {
    static void operator delete(void* ptr, std::size_t sz)
    {
        cout << "custom delete for size " << sz <<endl;
        delete (ptr); // ::operator delete(ptr) can also be used
    }
    static void operator delete[](void* ptr, std::size_t sz)
    {
        cout << "custom delete for size " << sz <<endl;
        delete (ptr); // ::operator delete(ptr) can also be used
    }
};

int main()
{
    P* var1 = new P;
    delete var1;

    P* var2 = new P[10];
    delete[] var2;
}

运行输出

custom delete for size 1
custom delete for size 14

技术问询

在这段重载了带std::size_t sz参数的operator delete及operator delete[]的代码中,std::size_t sz参数的值是在哪里被赋值的?

解答

这个std::size_t sz参数是由编译器在生成delete/delete[]的调用代码时自动赋值的:

  • 对于单个对象的delete操作:编译器在编译阶段就明确目标对象的类型,直接把sizeof(对应类型)(这里sizeof(P)为1,因为C++中空结构体最小占用1字节)作为sz参数传入重载的operator delete。
  • 对于数组的delete[]操作:编译器会计算数组的总内存大小——包含数组元素本身的大小,再加上数组头部额外存储的元数据(比如元素个数)的大小。示例里10个P对象占10字节,加上4字节的元数据(不同编译器可能有差异),总大小就是14字节,这个值会被编译器自动传入operator delete[]。

全程不需要开发者手动赋值,所有逻辑都由编译器在编译阶段处理完成。

内容的提问来源于stack exchange,提问作者Aison Li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:48:14