c ++ new和delete重载

时间:2017-07-04 13:15:59

标签: c++ visual-c++ c++14

使用不同的编译器和不同的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 - platform toolset v141&amp; sdk v10.0.15063.0

/std:c++14 and /std:c++latest
1
2
1
2

所有测试都在Windows 7上执行。我无法在GNU / Linux操作系统上测试编译器,因为我没有设置任何虚拟机。

1 个答案:

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