我正在尝试重载特定于类的运算符new和delete以使用自定义分配器,对于某些抽象基类:
class Base abstract
{
public:
void * operator new (size_t sz)
{
return tc_malloc(sz);
}
void operator delete(void* p){
tc_free(p)
}
我有一个类“Derived”继承自base(不是直接的,它是一个复杂的继承链,但最终它是从base派生的),并且有:
a = new Derived();
.
.
delete a;
现在发生了一件奇怪的事情......调用我的operator new,调用tc_malloc,但是为了“删除a;”从delete_scalar.cpp(默认的删除操作符)调用operator delete,这当然会导致异常,因为它试图释放malloc未分配的内存。
任何想法可能导致什么?
答案 0 :(得分:0)
所以我发现了问题: 它是因为删除是在一个不完整的类上调用的。 更具体地说,我有一个.h文件,看起来像这样:
class A; //forward declaration
class User {
A* a;
User();
~User(){
delete a; //this is the problem
}
所以对不完整类型调用delete,该类型具有未定义的行为。 所以这里不会调用析构函数或类特定的delete运算符
答案 1 :(得分:-1)
我认为C++ Virtual operator delete?可以帮助理解这里发生了什么。
如果我理解正确,总是使用派生程度最高的类的delete运算符,因此它必须使用Derived中的一个。似乎,因为您没有为Derived声明一个,所以使用了默认运算符。