使用不同的编译器和不同的c++标准进行编译时,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-平台工具集v141和sdk v10.0.15063.0
/std:c++14 and /std:c++latest
1
2
1
2
所有测试都是在Windows 7上执行的。由于没有设置任何VM,所以无法在GNU/Linux OS上测试编译器。
最佳答案
按照标准,这两个operator new[]
的默认行为是([new.delete.array]/4):
operator delete[]
([new.delete.array]/15)也有类似的情况:
这些函数的默认版本仅调用非数组形式。因此,Visual Studio和GCC 6.3是正确的:仅重载非数组版本应足以重载分配器。