gpt4 book ai didi

c++ - 强制隐式调用非标准删除运算符函数

转载 作者:行者123 更新时间:2023-11-27 23:24:35 24 4
gpt4 key购买 nike

C++ 中的 AFAIK(或至少在我的编译器中:gcc 和 clang)允许以下代码:

struct BLA { void *operator new( std::size_t size, int i1, int i2 ); };

int main( void )
{
struct BLA *bla = new (3,5) BLA;
return 0;
}

IMAO 这非常酷,因为它允许使用非常简洁的语法来分配存储空间。
使用这种技术,我可以传递属性变量,以一种非常干净的方式分配对象,而不必滥用构造函数。
不幸的是,C++ 标准说(AFAIK)类似的方法不适用于“删除”运算符。即:

struct BLA
{
void *operator new( std::size_t size, int i1, int i2 );
void operator delete( void *p, int i1, int i2 );
};

int main( void )
{
struct BLA *bla = new (3,5) BLA;
delete (3,5) bla;
return 0;
}

在“删除”行给出硬错误。
有没有办法(也许是编译器开关)允许这种非标准的隐式调用
BLA::运算符删除( bla, 3, 5 )?

使用上面的行会破坏漂亮的语法 :(

最佳答案

无法将参数传递给删除运算符。看到 Bjarne 对此的推理 here .重载删除(例如您正在实现的删除)仅在明确调用或相应的新抛出时使用。

如果您需要确保调用了正确的删除,可以使用一个技巧。如果你只有两个 32 位的 int 传递给构造函数,只需保留比需要多的 64 位并将这两个参数放在对象的前面(你只需要在返回指针之前返回偏移的位置)。当你删除你的对象时,不要传递任何参数,而是从对象前面获取它们并使用它们正确地释放。这样您就可以使用不带参数的删除,并且可以确保每个对象都被正确释放。

不确定以下是否会被视为您系统中的错误:

struct BLA *bla = new (3,5) BLA;
delete (4,6) bla;

即如果有可能以不同于分配的方式解除分配,则此方法将不起作用。如果以不同的方式解除分配是危险的,那么显式保存参数的这种方式实际上要安全得多。

关于c++ - 强制隐式调用非标准删除运算符函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10286446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com