gpt4 book ai didi

c++ - 重载 operator new 和匹配的 delete

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:12 25 4
gpt4 key购买 nike

我在子类中重载了 operator new/delete,我注意到一种对我来说似乎很奇怪的行为。看看下面的示例代码:

#include <stdlib.h>
#include <stdio.h>

class Base
{
public:

virtual ~Base()
{
}
};

class Derived : public Base
{
public:

void* operator new(unsigned int size, int capacity)
{
printf("> new(unsigned int, int)\n");
return malloc(sizeof(Derived));
}

void operator delete(void* ptr, int)
{
printf("> delete(void*, int)\n");
free(ptr);
}

void operator delete(void* ptr)
{
printf("> delete(void*)\n");
free(ptr);
}
};

int main(int argc, char** argv)
{
Base* base = new (0) Derived();
delete base;

return 0;
}

此代码在使用 Visual Studio 2010 编译时生成以下输出:

> new(unsigned int, int)
> delete(void*)

为什么匹配的删除运算符 (Derived::operator delete(void*, int)) 没有在这里被调用?无论我做什么,我都无法获取调用匹配运算符删除的代码。

最佳答案

基本咒语:

没有放置-删除表达式。

如果使用placement-new创建对象,必须手动销毁,然后调用释放函数:

Base * p = new (0) Derived;

p->~Derived();

Derived::operator delete(p, 0);

如果您愿意,在您的代码中说delete base; 是一种未定义的行为,因为您从未获得base 作为标准new 表达式的结果。完全有可能您定义了一个执行完全不同的事情的新布局分配函数,并且调用标准的 operator delete-deallocation 函数可能会造成彻底的破坏。碰巧在你的程序中它成功了。

关于c++ - 重载 operator new 和匹配的 delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16595642/

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