0

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

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

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

下面的代码只是一个说明,与我的 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);
}
4

1 回答 1

6

不,这会泄漏内存。

from 的每个返回值都malloc()必须用作对 的不同调用中的参数free()。对于这种用法,请查看realloc()哪种方法会使它更符合您的预期,因为它允许您增加一块已经分配的堆内存。

mPoolAllocator从 . 返回的先前指针的变量中没有任何痕迹malloc()

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

于 2013-09-30T13:06:59.603 回答