gpt4 book ai didi

c++ - C/C++ malloc/免费。对多个分配使用一个指针 - 坏主意?

转载 作者:太空宇宙 更新时间:2023-11-04 15:44:20 24 4
gpt4 key购买 nike

如果这是一个愚蠢的问题,我深表歉意 - 我一直在自学 C++,目前正在编写一个内存管理器作为我自己的练习,但我不清楚调用 malloc 时幕后发生了什么并且免费。我在下面提供了一些框架代码,希望能更好地说明我的问题。

我已经覆盖了全局的 new 和 delete 运算符以调用 MemoryManager 类的 Alloc(size_t) 和 Free(void*) 方法,并设置了一些运行良好的内存池。但是,我允许我的其中一个池在需要时增长。这个池是通过将一些堆内存分配给一个指针来初始化的:char* mPoolAllocator。

我的问题基本上是:当我增大池时,使用相同的指针 (mPoolAllocator) 分配一些新的堆内存是否安全?当我在下面的 ~MemoryManager() 中调用 free(mPoolAllocator) 时会发生什么?默认内存管理器是否跟踪我使用此指针分配的堆内存的每一位,并允许我在一次 free 调用中释放它们,或者它只是释放从指针最后设置的地址开始的 block 到?

下面的代码只是一个示例,与我的 MemoryManager 类的工作方式相去甚远:我主要是在寻找有关 malloc() 和 free() 的反馈。

................................................ ..................................................... ..................................................... ..........类内存管理器

class MemoryManager
{
public:
MemoryManager();
~MemoryManager();

void* Alloc(size_t size);
void Free(void* address);

private:
size_t mFreeMemory; // unallocated memory left
char* mPoolAllocator, // used to alloc memory from the heap
* mUnallocated; // points to front of free blocks linked list

void ExtendPool(); // extends pool, increasing available memory

void* GetBlock(size_t size); // returns heap address sufficient for and object of size
}

.

void* MemoryManager::Alloc(size_t size)
{
/* If there is free memory */
if(size <= mFreeMemory)
{
return GetBlock(size);
}
else // else create new free memory
{
ExtendPool();
return GetBlock(size);
}
}

.

void MemoryManager::ExtendPool()
{
mPoolAllocator = (char*)malloc(POOL_EXTEND_SIZE);

// some calls to functions that split the extended pool into blocks

mUnallocated = mPoolAllocator; // point to the next unallocated memory block (beginning of extended pool)
}

.

MemoryManager::~MemoryManager()
{
free(mPoolAllocator);
}

最佳答案

不,那会泄漏内存。

malloc() 的每个返回值都必须用作对free() 的不同调用中的参数。对于这种用法,请查看 realloc(),这将使它更像您期望的那样工作,因为它允许您增加一 block 已分配的堆内存。

mPoolAllocator 变量中没有从 malloc() 返回的先前指针的踪迹。

此外,在 C++ 中,您不应该使用 new[] 来分配字节数组吗?

关于c++ - C/C++ malloc/免费。对多个分配使用一个指针 - 坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19095029/

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