重载新阵列运算符的安全性如何?

hus*_*sik -1 c++ operator-overloading memory-alignment

假设我正在使用一个结构在堆上分配并用作

  • new []和delete []
  • shared_ptr(new [])

然后我可以简单地重载它的新数组运算符,不要触摸任何delete []运算符

struct  alignas(256)  MyStruct
{
    Item i1,i2;
    void * operator new[](unsigned long int size)
    {
        return aligned_alloc(256,size);
    }

    void * operator new (unsigned long int size)
    {
        return aligned_alloc(256,size);
    }
};
Run Code Online (Sandbox Code Playgroud)

并认为它没有任何泄漏?

GCC 6.3和c ++ 0x.

cma*_*ter 5

事实是,无法保证标准库如何实现这些operator new()功能.你的标准实施可能只是通过打电话向malloc()free(),但这样做不是必需的.它也可以使用sbreak()系统调用本身来支持它管理的内存对象.或者它可以使用mmap()系统调用.

这三者中的任何一个都是完全可能的,并且与其他两个实现不兼容.而且,同样糟糕的是,您的标准operator delete()实现可能会查询您传入其中的指针前面的一些隐藏数据字段以执行其内部簿记.如果传递给您的标准operator delete()的指针实际上不是匹配返回的指针,则operator new()您具有未定义的行为.事情发生的可能性非常高.

没有办法解决它:如果你供应operator new(),你也必须供应operator delete().否则,一切都会破裂.