new
和delete
运算符重载可能会也可能不会起作用。这是正常行为吗?
我使用以下代码来测试编译器。
#include <iostream>
void * operator new(size_t size)
{
std::cout << "1\n";
return malloc(size);
}
void operator delete(void *ptr) noexcept
{
std::cout << "2\n";
free(ptr);
}
int main(void)
{
int *n1 = new int;
delete n1;
int *n2 = new int[10];
delete[] n2;
return 0;
}
以下是我测试代码的几个编译器的结果。
mingw-w64官方版 - x86_64-7.1.0-release-posix-seh-rt_v5-rev0.7z
c++11
1
2
c++14
1
clang x86_64 - 使用上面的编译器手动构建没有补丁的v4.0.0
c++11 and c++14
1
2
msvc - platform toolset v141&amp; sdk v10.0.15063.0
/std:c++14 and /std:c++latest
1
2
1
2
所有测试都在Windows 7上执行。我无法在GNU / Linux操作系统上测试编译器,因为我没有设置任何虚拟机。
答案 0 :(得分:2)
根据标准,operator new[]
的默认行为是([new.delete.array] / 4):
分别返回
operator new(size)
或operator new(size, alignment)
。
类似于operator delete[]
([new.delete.array] / 15):
具有
size
参数的函数将其他参数转发到没有size
参数的相应函数。没有size
参数的函数将其参数转发给相应的operator delete
(单个对象)函数。
这些函数的默认版本只调用非数组表单。因此,Visual Studio和GCC 6.3是正确的:仅重载非数组版本应足以使分配器重载。