重载新内存和删除C++跟踪内存分配
我需要帮助理解下面截取的代码…allocate是一个函数,重载的新操作符将调用它来分配内存。我在尝试理解以下类型时遇到问题:重载新内存和删除C++跟踪内存分配,c++,memory,operator-overloading,allocation,new-operator,C++,Memory,Operator Overloading,Allocation,New Operator,我需要帮助理解下面截取的代码…allocate是一个函数,重载的新操作符将调用它来分配内存。我在尝试理解以下类型时遇到问题: *static_cast<std::size_t*>(mem) = pAmount; //please explain? return static_cast<char*>(mem) + sizeof(std::size_t); //? 和 代码如下所示: const std::size_t allocation_limit = 107374
*static_cast<std::size_t*>(mem) = pAmount; //please explain?
return static_cast<char*>(mem) + 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);
}
分配器跟踪分配的大小,方法是将分配与它提供给客户机代码的块一起保存。当请求pAmount字节块时,它会在开始时分配一个额外的sizeofsize\u t字节,并将大小存储在那里。要达到此大小,它将从malloc获取的mem指针解释为大小,并取消引用*static\u castmem=pAmount;。然后返回块的其余部分,该部分从mem+sizeofsize\u t开始,因为这是客户端可能使用的部分 解除分配时,它必须将从malloc获得的确切指针传递给free。要获取此指针,它将减去在allocate member函数中添加的sizeofsize\t字节
在这两种情况下,都需要对char*进行强制转换,因为无效指针上不允许使用指针算法。分配器通过将分配的大小与其提供给客户端代码的块保持在一起来跟踪分配的大小。当请求pAmount字节块时,它会在开始时分配一个额外的sizeofsize\u t字节,并将大小存储在那里。要达到此大小,它将从malloc获取的mem指针解释为大小,并取消引用*static\u castmem=pAmount;。然后返回块的其余部分,该部分从mem+sizeofsize\u t开始,因为这是客户端可能使用的部分 解除分配时,它必须将从malloc获得的确切指针传递给free。要获取此指针,它将减去在allocate member函数中添加的sizeofsize\t字节
在这两种情况下,都需要对char*进行强制转换,因为无效指针上不允许使用指针算法。为了知道删除时需要清理多少内存,并提供一些诊断,分配器将大小存储在额外分配的内存中 *静态_castmem=pAmount//请解释一下 这将获取分配的内存并将分配的字节数存储到此位置。出于存储目的,强制转换将原始内存视为大小 返回静态\u castmem+ sizeofstd::size\u t;/ 这将向前移动超过大小字节,到达应用程序将使用的实际内存,并返回该指针 void*mem= 静态存储- sizeofstd::size\u t;/
这是将先前返回给用户的块移回先前存储大小的实际分配块。需要进行检查并回收内存。为了知道删除内存时需要清理多少内存,并提供一些诊断,分配器将大小存储在额外分配的内存中 *静态_castmem=pAmount//请解释一下 这将获取分配的内存并将分配的字节数存储到此位置。出于存储目的,强制转换将原始内存视为大小 返回静态\u castmem+ sizeofstd::size\u t;/ 这将向前移动超过大小字节,到达应用程序将使用的实际内存,并返回该指针 void*mem= 静态存储- sizeofstd::size\u t;/
这是将先前返回给用户的块移回先前存储大小的实际分配块。需要执行检查和回收内存。需要强制转换才能获得正确的偏移量,因为void*不是具有大小的类型 当你写作时 返回static\u castmem+sizeofstd::size\u t 在添加偏移字节之前,指针被强制转换为char*
取消分配时也可以使用减法。由于void*不是具有大小的类型,因此需要强制转换以获得适当的偏移量 当你写作时 返回static\u castmem+sizeofstd::size\u t 在添加偏移字节之前,指针被强制转换为char*
取消分配时同上。void*allocatestd::size\u t pAmount 分配pAmount内存加上存储大小的空间
|-size-|---- pAmount of memory-----|
^
|
allocate将返回一个刚刚粘贴到大小字段的指针
void deallocate(void* pMemory)
将指针移回起始位置
|-size-|---- pAmount of memory-----|
^
|
释放它
一,
二,
三,
void*allocatestd::size\u t pAmount 分配pAmount内存加上存储大小的空间
|-size-|---- pAmount of memory-----|
^
|
allocate将返回一个刚刚粘贴到大小字段的指针
void deallocate(void* pMemory)
将指针移回起始位置
|-size-|---- pAmount of memory-----|
^
|
释放它
一,
二,
三,
解除分配不需要额外的信息。免费处理。解除分配不需要额外的信息。空闲句柄。因此*static\u castmem=pAmount可以写为size\t*ptr=static\u castmem…这里ptr指向分配内存的开头,然后*ptr=pAmount?在里面
在allocate函数中,返回0和返回NULL之间是否存在差异?NULL只是一个值为0的宏吗?根据C++标准,NULL扩展为实现定义的空指针,它可能是空的**。它是从C继承而来的传统。当您表示空指针时使用0,如果您正在编写C++0x,则使用null ptr。因此*static\u castmem=pAmount可以写成size\t*ptr=static\u castmem…这里ptr指向分配内存的开始,然后*ptr=pAmount?在allocate函数中,返回0和返回NULL之间是否存在差异?NULL只是一个值为0的宏吗?根据C++标准,NULL扩展为实现定义的空指针,它可能是空的**。它是遗留的,从C继承而来。当您表示空指针时使用0,如果您正在编写C++0x,则使用nullptr。
`void* mem = static_cast<char*>(pMemory) - sizeof(std::size_t);`
// mem points size of size_t before pMemory