有没有办法让C++类在它开始执行析构函数之前自动执行一个方法?

Jer*_*ner 2 c++ destructor c++11

这是一个问题场景:我有一个C++对象,其中包含一个需要在销毁对象之前调用的Cleanup()虚方法.为了做正确的事情,这个Cleanup方法需要访问完全形成的对象(包括子类数据),所以我不能只在我自己的类的析构函数的开头调用Cleanup(),因为当我的类的时候析构函数被调用,析构函数中的任何子类都已经完成,它们可能已经释放了一些需要查看的Cleanup()数据.

显而易见的解决方案是在删除对象之前要求调用代码手动调用我的例程:

theObject->Cleanup();
delete theObject;
Run Code Online (Sandbox Code Playgroud)

但是这个解决方案很脆弱,因为迟早有人(可能是我)会忘记调用Cleanup()并且会发生坏事.

另一个解决方案是拥有一个"holder"对象,它实现了pImpl技术来包装类,并且在删除对象之前让持有者对象的析构函数在对象上调用Cleanup(); 但是这个解决方案也不是100%理想的,因为它使得类与标准C++类的工作方式不同,并且无法在堆栈上或静态地分配对象.

所以问题是,是否有一些聪明的技术(在C++或C++ 11中)可以用来告诉编译器在调用第一个子类析构函数之前自动调用我的对象上的指定(可能是虚拟的)方法?

(想到它,自动调用Init()方法的类似机制 - 就在最后一个子类构造函数完成之后 - 也可能很方便)

Mat*_* M. 6

横向思维:摆脱Cleanup方法,这就是virtual析构函数的用途.

virtual析构函数的目标是允许在delete basepointer;执行时调用最外部的派生类析构函数; 正如RAII所证明的那样,清理析构函数的工作.

现在你可能会争辩说你想要一个早期的Cleanup方法,以简化析构函数的任务,或者重用对象(有点像某种Reset方法).在实践中,它很快就变成了维护噩梦(太容易忘记清理一个区域并且从一个用户到另一个用途的状态泄漏).

所以问自己一个问题:为什么不使用析构函数来创建它?