【发布时间】:2012-06-06 07:58:27
【问题描述】:
这是一个问题场景:我有一个 C++ 对象,其中包含一个需要在对象被销毁之前调用的 Cleanup() 虚拟方法。为了做正确的事,这个 Cleanup 方法需要访问完整的对象(包括子类数据),所以我不能只在我自己的类的析构函数开始时调用 Cleanup(),因为当我的类的当调用析构函数时,任何子类的析构函数都已经完成,它们可能已经释放了一些 Cleanup() 需要查看的数据。
显而易见的解决方案是要求调用代码在删除对象之前手动调用我的例程:
theObject->Cleanup();
delete theObject;
但该解决方案很脆弱,因为迟早有人(可能是我)会忘记调用 Cleanup() 并且会发生坏事。
另一种解决方案是拥有一个实现 pImpl 技术的“持有人”对象来包装类,并在删除对象之前让持有人对象的析构函数调用该对象的 Cleanup();但该解决方案也不是 100% 可取的,因为它使类的工作方式与标准 C++ 类不同,并且无法在堆栈上或静态分配对象。
所以问题是,是否有一些聪明的技术(在 C++ 或 C++11 中)可以用来告诉编译器在调用第一个子类之前自动调用我的对象上的指定(可能是虚拟)方法-析构函数?
(想想看,自动调用 Init() 方法的类似机制——就在最后一个子类构造函数完成之后——也可能很方便)
【问题讨论】:
-
太短以至于不值得回答:你想要的存在于 Common Lisp 对象系统中,它的
:before、:after和:around方法。其他一些语言也有类似的概念,但 C++ 没有(至少据我所知没有)。
标签: c++ c++11 destructor