gpt4 book ai didi

c++ - 重载 new 和 delete C++ 以跟踪内存分配

转载 作者:太空宇宙 更新时间:2023-11-03 10:35:06 25 4
gpt4 key购买 nike

我需要帮助来理解下面截取的代码...allocate 是一个函数,重载的 new 运算符将调用它来分配内存。我在尝试理解以下强制转换时遇到问题:

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

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

和..

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

代码如下:

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

最佳答案

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

在解除分配时,它必须传递它从malloc 得到的确切指针。至 free .为了得到这个指针,它减去 sizeof(size_t)它在 allocate 中添加的字节成员函数。

在这两种情况下,转换为 char*是必需的,因为在 void 上不允许使用指针算法指针。

关于c++ - 重载 new 和 delete C++ 以跟踪内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5233963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com