在 C++ 中使用 size_t sz 的附加参数重载运算符 delete

Ais*_* Li 6 c++ overloading operator-overloading dynamic-memory-allocation

下面的代码允许您查看被删除的变量的大小:

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

custom delete for size 1
custom delete for size 14
Run Code Online (Sandbox Code Playgroud)

我的问题是:参数在哪里std::size_t sz获得赋值?

BoP*_*BoP 1

Where does argument std::size_t sz get assigned value?
Run Code Online (Sandbox Code Playgroud)

编译器就是这样做的。该表达式delete var;有两部分 - 首先P调用 for 的析构函数(如果有),然后operator delete使用编译器提供的参数进行调用。

尽管名称相似,“删除运算符”operator delete是两个不同的东西。

(比亚恩表示,他很遗憾没有想出更好的名字)。