C++11 - 检测运算符 new [] 的方法

C++11 - Way to detect the operator new[]

本文关键字:方法 new 检测 运算符 C++11      更新时间:2023-10-16

我正在尝试使这样的事情工作:

struct holder {
  std::function<void()> destroyer;
  template<typename T>
  holder(T) = delete;
  template<typename T>
  holder(std::enable_if< WAS CREATED WITH new > pointer) {
    destroyer = [=] { delete pointer; };
  };
  template<typename T>
  holder(std::enable_if< WAS CREATED WITH new[] > array) {
    destroyer = [=] { delete[] array; };
  };
  virtual ~holder() {
    destroyer();
  };
 };

然后,我可以简单地进行return new test;return = new test[10];返回holder的函数。但我发现它永远不会被视为数组,因为operator new[]返回一个指针。

有什么方法可以达到预期的结果吗?

谢谢! :)

这是不可能的;是否使用了newnew[]不是指针类型信息的一部分。

我知道的唯一方法是通过放置-new

#include <new>
#include <iostream>
struct A
{
    void* operator new(std::size_t n, void* ptr)
    {
        std::cout << "operator new()n";
        return ptr;
    }
    void* operator new[](std::size_t n, void* ptr)
    {
        std::cout << "operator new[]n";
        return ptr;
    }
};
int main()
{
    A* ptr;
    new (ptr) A();
    new (ptr) A[5];
}