使用不同的编译器和不同的c++标准进行编译时,newdelete运算符重载可能会或可能不会起作用。这是正常现象吗?

我使用以下代码来测试编译器。

#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是正确的:仅重载非数组版本应足以重载分配器。

07-24 09:45
查看更多