【发布时间】:2019-05-29 21:30:51
【问题描述】:
当我在 GCC 和 Clang 中运行此代码示例时
struct S
{
int a;
void *operator new(size_t s)
{
std::cout << "new " << s << std::endl;
return ::operator new(s);
}
void operator delete(void *p, size_t s) noexcept
{
std::cout << "delete " << s << std::endl;
::operator delete(p);
}
void operator delete(void *p) noexcept
{
std::cout << "delete " << "none" << std::endl;
::operator delete(p);
}
};
int main()
{
S *p = new S;
delete p;
}
我从 GCC 和 Clang 得到以下输出
new 4
delete none
这意味着编译器选择了operator delete 的“无大小”版本。
但是,如果我尝试使用全局替换的 operator new 和 operator delete 函数进行类似的操作
struct S
{
int a;
};
void *operator new(size_t s)
{
std::cout << "new " << s << std::endl;
return std::malloc(s);
}
void operator delete(void *p, size_t s) noexcept
{
std::cout << "delete " << s << std::endl;
std::free(p);
}
void operator delete(void *p) noexcept
{
std::cout << "delete " << "none" << std::endl;
std::free(p);
}
int main()
{
S *p = new S;
delete p;
}
从 GCC 我得到 p>
new 4
delete 4
我从 Clang 得到
new 4
delete none
我知道自 C++98 以来 C++ 中就出现了类内 operator delete 的“大小”版本,但是通过 C++98 看,我似乎无法找到明确的答案在第一个示例中应该选择哪个版本的operator delete 的问题。甚至指定了吗?
在第二个示例中,C++14 及其全局operator delete 的“大小”版本又如何呢?语言是否说明应该选择哪个版本?
【问题讨论】:
标签: c++ operator-overloading c++14 language-lawyer delete-operator