c ++ operator delete重载不适用于派生类

时间:2018-01-30 10:54:53

标签: c++ operator-overloading new-operator delete-operator

我正在尝试重载特定于类的运算符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未分配的内存。

任何想法可能导致什么?

2 个答案:

答案 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声明一个,所以使用了默认运算符。