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
相关产品推荐
相关产品推荐

