C++ c++;运算符delete重载不适用于派生类

C++ c++;运算符delete重载不适用于派生类,c++,operator-overloading,new-operator,delete-operator,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) } 我有一个从基继承的“派生”类(不是直接的,它是一个复杂的继承链,但最终它是从基派生的),并且有: a = new Derived();

我试图重载特定于类的运算符new和delete,以便对某些抽象基类使用自定义分配器:

class Base abstract
{
public:
void * operator new (size_t sz)
{
   return tc_malloc(sz);
}
void operator delete(void* p){
   tc_free(p)
}
我有一个从基继承的“派生”类(不是直接的,它是一个复杂的继承链,但最终它是从基派生的),并且有:

a = new Derived();
.
.
delete a;
现在一件奇怪的事情发生了。。调用我的运算符new,调用tc_malloc,但对于“delete a”,则从delete_scalar.cpp(默认的delete运算符)调用运算符delete,这当然会导致异常,因为它试图释放malloc未分配的内存

你知道这是什么原因吗?

我想这有助于理解这里发生了什么

如果我理解正确,那么总是使用派生类最多的delete操作符,因此它必须使用派生类中的delete操作符。看起来,因为您没有为派生声明一个,所以使用了默认运算符。

所以我发现了问题: 这是因为对一个不完整的类调用了delete。 更具体地说,我有一个.h文件,看起来像这样:

class A; //forward declaration
class User {
   A* a;
   User();
   ~User(){
      delete a; //this is the problem
}
因此,对具有未定义行为的不完整类型调用delete。
因此,这里既不调用析构函数,也不调用特定于类的delete运算符

您使用的是哪种编译器?使用GCC(最新版本)工作正常。您能创建一个新的吗?它会使回答更容易。操作员不应该被声明为静态吗?@ PaoloBrandoli:不重要,C++中有一个特殊的规则,使这些运算符“代码>静态< /Cord>类成员,即使<代码>静态< /Cord>关键字未被使用。C++具有多重继承性。想想你的期望是什么,然后想想你的期望如何与多重继承相互作用。不是这样,但如果它是重复的,那么就把它标记为suchn不确定我是否会称之为重复的。当然,这是相关的,但不是完全相同的问题。仍然在弄清楚什么是重复的阈值。我也尝试在派生类中重写delete操作符,但没有成功