重载新的和删除C++以跟踪内存分配

max*_*yne 1 c++ memory allocation operator-overloading new-operator

我需要帮助理解下面剪切的代码... allocate是一个函数,由重载的new运算符调用以分配内存.我在尝试理解以下演员表时遇到问题:

*static_cast<std::size_t*>(mem) = pAmount; //please explain?

return static_cast<char*>(mem) + sizeof(std::size_t); //? 
Run Code Online (Sandbox Code Playgroud)

和..

// get original block
void* mem = static_cast<char*>(pMemory) - sizeof(std::size_t); //?
Run Code Online (Sandbox Code Playgroud)

代码如下所示:

const std::size_t allocation_limit = 1073741824; // 1G
    std::size_t totalAllocation = 0;

    void* allocate(std::size_t pAmount)
    {
        // make sure we're within bounds
        assert(totalAllocation + pAmount < allocation_limit);

        // over allocate to store size
        void* mem = std::malloc(pAmount + sizeof(std::size_t));
        if (!mem)
            return 0;

        // track amount, return remainder
        totalAllocation += pAmount;
        *static_cast<std::size_t*>(mem) = pAmount;

        return static_cast<char*>(mem) + sizeof(std::size_t);
    }

    void deallocate(void* pMemory)
    {
        // get original block
        void* mem = static_cast<char*>(pMemory) - sizeof(std::size_t);

        // track amount
        std::size_t amount = *static_cast<std::size_t*>(mem);
        totalAllocation -= pAmount;

        // free
        std::free(mem);
    }
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 6

分配器通过将它们与它为客户端代码提供的块一起保持跟踪分配的大小.当被要求输入一个pAmount字节块时,它会sizeof(size_t)在开头分配一个额外的字节并在那里存储大小.为了达到这个大小,它将mem它所获得的指针解释malloc为a size_t*并取消引用(*static_cast<std::size_t*>(mem) = pAmount;).然后它返回块的其余部分,从块开始mem + sizeof(size_t),因为这是客户端可能使用的部分.

重新分配时,必须通过它得到了确切的指针mallocfree.要获得此指针,它会减去sizeof(size_t)它在allocate成员函数中添加的字节.

在这两种情况下,char*都需要强制转换,因为指针上不允许指针运算void.