我正在编写用于动态内存分配的内存管理器。为了让class A
在调用operator new
(或delete
)时使用它,class A
可以从class CustomAllocate
继承,而new
本身会重载{ {1}}和delete
以使用内存管理器的方式。
但是,显然我完全错过了对齐要求。不幸的是,CustomAllocate::new
没有关于class A
继承的信息,因为唯一的参数是请求的内存大小。我正在寻找一种包括对齐信息的方法,而不必在每个new
中重载delete
(和class A
)来使用内存管理器。
使用表示对齐要求的整数值对class CustomAllocate
进行模板处理,并像这样class A : public CustomAllocate< alignof(A) >
进行继承。
不可能,因为alignof(A)
在必须作为模板参数传递时是未知的,即使传递的参数从不改变class A
的对齐要求。
具有一个纯虚函数virtual int CustomAllocate::getAlignment() = 0
,该函数通过复制粘贴class A
之类的方法在每个return alignof(A);
中实现。
不可能,因为new
是静态的,因此永远无法访问虚拟函数。
任何可行的想法吗?
答案 0 :(得分:1)
令我惊讶的是,以下方法似乎有效:
template <typename T> class CustomAllocate
{
public:
void* operator new (std::size_t count)
{
std::cout << "Calling new, aligment = " << alignof (T) << "\n";
return aligned_alloc (alignof (T), count);
}
void operator delete (void *p)
{
std::cout << "Calling delete\n";
free (p);
}
};
测试程序:
class A : public CustomAllocate <A>
{
public:
A (int a, int b) : a (a), b (b) { }
int a, b;
};
int main ()
{
A *x = new A (1, 2);
std::cout << x->a << ", " << x->b << "\n";
delete x;
}
输出:
Calling new, aligment = 4
1, 2
Calling delete