当前malloc函数的问题是它不跟踪存储返回的内存位置的变量。因为很难在内存中移动,所以可能会出现这种碎片。
MMU只能在一定程度上解决这个问题。让我们假设malloc采用双指针并跟踪变量。调用free将允许free在内存中移动并改变内存位置。
我不太可能是第一个想到这一点的人,所以我想知道是否有一个标准的C函数可以做到这一点或POSIX函数?
我知道这个想法并不完美。该程序将不得不传递相同的变量,而不是复制它,但它确实解决了碎片问题,这对我来说确实很重要,因为我使用低内存设备。当然,如果有必要,realloc()函数会将先前分配的内存块移动到一个新的(更大的)位置。但是,这并不一定会影响碎片化。
我的解决方案(在C中)是(在低内存条件下)做我自己的内存管理。
虽然不是相同的机制,但与您所说的最接近的是用boost库实现的智能指针。然而,它们是为c++构建的。
智能指针是"聪明"的,因为它们在不需要之后不会徘徊(并且您不必释放它们),因此它们避免了您引用的大多数碎片问题。
跟踪哪个变量指向哪个内存位置不能仅仅通过将指针传递给指针来完成。如果已分配内存的地址被复制到另一个变量怎么办?C与跟踪对象引用的Java不同。在您的情况下,您最好自己管理内存,方法是预先分配大块内存并根据需要拆分它,跟踪使用情况,简而言之,实现您自己的内存管理。
当您开始考虑实现细节时,这个想法并不那么吸引人。当然,你也可以编写一个返回双指针的函数。中间指针呢?应该存放在哪里?程序本身显然不能存储它,因为中间指针应该与指向内存具有完全相同的生存期。因此分配器本身应该存储和管理它。中间指针所在的内存是不可移动的。但致命的错误是该方案不是线程安全的。由于指针可以在底层自由更改,因此每次指针解引用现在都需要一个锁。