C ++适当覆盖new []和delete []

问题描述

this库中,newdeletenew[]delete[]有以下全局替代项:

/* ------------------------------------------------------------ */
/* ---------------------- new and delete ---------------------- */
/* ------------------------------------------------------------ */

/* ---------------------------------------- operator new */

void *operator new(size_t size)
{
    void *p = MemTrack::TrackMalloc(size);
    if (p == NULL) throw std::bad_alloc();
    return p;
}

/* ---------------------------------------- operator delete */

void operator delete(void *p)
{
    MemTrack::TrackFree(p);
}

/* ---------------------------------------- operator new[] */

void *operator new[](size_t size)
{
    void *p = MemTrack::TrackMalloc(size);
    if (p == NULL) throw std::bad_alloc();
    return p;
}

/* ---------------------------------------- operator delete[] */

void operator delete[](void *p)
{
    MemTrack::TrackFree(p);
}

newdelete的替代对我来说很有意义。但是new[]delete[]呢?当使用new[]创建新数组时,c ++中的AFAIK也会在指针之前存储元素的数量,以便delete[]可以在元素上调用析构函数。覆盖new[]delete[]时是否需要考虑这一点,或者是否存在某种隐式“包装器”将其添加到覆盖实现的所有分配之外? 如果没有,如何正确完成?似乎new[]运算符也只获取应分配的字节数,而不是元素数。

解决方法

您的假设是错误的

使用new []创建新数组时,c ++中的AFAIK也会存储 元素数

C ++中没有任何内容说明必须如何实现new[]

请注意,newnew[]operator newoperator new[]不同,前者的调用构造函数(在new[]的情况下可能会做一些记账以跟踪构造了多少个元素,我想这就是您提到的包装器)。 operator newoperator new[]的唯一职责是分配足够的内存。

,

根据CPP referencenew[]的标准库实现实际上调用new

  1. 由new []-expressions的数组形式调用以分配所有 数组所需的存储空间(包括可能的new表达式 高架)。标准库实现调用版本(1)

之所以有意义,是因为在两种情况下,size的参数operator new表示要分配的字节数,而忽略了对象数,这与该运算符无关。关心对象数量的运算符是operator []