您将需要找到一种方法来保留原始指针,否则您free
将变得非常糟糕。
对齐是一个简单的例子(假设alignment
是 2 n值):
void *aligned = reinterpret_cast<void *>(
(reinterpret_cast<uintptr_t>(mem) + alignment-1) & ~(alignment-1));
但是,就像我说的,您需要将原始指针保存在某处。这可能意味着分配“一点额外的”(例如sizeof(void *)
)。
所以我们最终会得到这样的结果:
assert(!(alignment & alignment-1)); // Don't like aligment not power of 2.
size_t extra = sizeof(void *);
void *mem = malloc(size + extra + alignment-1);
if (!mem)
throw bad_alloc();
void *aligned = reinterpret_cast<void *>(
(reinterpret_cast<uintptr_t>(mem) + extra + alignment-1) & ~(alignment-1));
void **ptr = reinterpret_cast<void **>(aligned);
ptr[-1] = mem;
return aligned;
然后在操作符delete中,需要挖出你原来的指针:
operator delete(void *mem)
{
void **ptr = reinterpret_cast<void **>(mem); // This is the "aligned" pointer.
void *orig_mem = ptr[-1];
free(orig_mem);
}