2017-07-28 30 views
-2

假设我使用一个结构要在堆上分配,并且用作重载新数组运算符有多安全?

  • 新[]和删除[]
  • shared_ptr的(新[])

然后可以我简单过载其新的数组运算符并不触及任何删除[]运算符

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); 
    } 
}; 

并认为它没有任何泄漏?

GCC 6.3和C++ 0X。

+2

为什么你认为你不需要提供'delete'和'删除[]'呢? – geza

+0

它不是叫free()吗? free()对于各种_alloc_命令是否足够了? –

+0

'it'是什么意思?谁应该叫'free()'? – geza

回答

5

事实是,对你的标准库是如何实现这些功能operator new()没有保证,任何责任。您的标准实施可能只需致电malloc()free(),但不需要这样做。它也可以使用系统调用本身来支持它管理的内存对象。或者它可以使用mmap()系统调用。

这三者的任是完全可能的,并且不兼容的与其它两个实施方式。而且,同样糟糕的是,您的标准实现可能会查阅您传入其中的一些隐藏数据字段,以执行其内部簿记。如果传递到您的标准operator delete()指针实际上不是,是由匹配operator new()返回一个指针,你有不确定的行为。发生非常糟糕的事情的可能性非常高。

确实没有办法绕过它:如果您提供operator new(),您还必须提供operator delete()。否则,所有地狱都可能破裂。

1

如果您在对象上重载new,你应该重载delete为好。同样,如果您超载new[],则应该重载delete[]。这是因为对象将使用默认的delete,这可能会导致崩溃,具体取决于您如何与new混淆。

取决于你的编译器,delete可致电free()反正,但你应该进入超载既newdelete,特别是如果你改变你的对象被分配方式的习惯。

+1

“,因为'delete'无论如何都会调用'free()'”,这并不能保证。 – geza