0

我不确定这是否可能。

我需要防止从 X 派生的所有类被实例化为本地堆栈或成员变量。我使他们所有的析构函数都受到保护,就外部范围而言,这起到了作用。但是,我也需要防止它们被自己实例化。我的意思是,如果 Y 具有 Z 类型的成员变量或在其方法中实例化 Z 类型的局部变量,则不会削减它。

现在我可以在层次结构树的所有叶子中创建私有析构函数,但问题是每个 not 都应该被允许成为(堆)变量。在 X <- Y <- Z 的情况下,所有三个都应该被实例化,但 X 和 Y 不能有私有析构函数。此外,即使这样也不能阻止我在 Z 的方法中使用 Z 类型的局部变量。

我想通过将它们的构造函数设为私有并将 operator new 添加为所有它们的朋友就可以了,但这是很多额外的工作(因为我们使用了 operator new 的多个版本)并且层次结构很大。

那么,有没有办法让这些对象的堆栈实例化(最好)编译时或运行时错误,而不诉诸私有构造函数朋友新方式?

<edit> 问题是这个项目的以前的程序员写了大量的代码,这个层次结构中的所有类都有非常复杂的析构函数。而且,作者在这些 destructros 中不加选择地调用了虚拟方法,这导致了许多(对他们而言)无法解释的崩溃和内存损坏。现在将所有析构函数转换为obj->Release()模式,并且在我拥有的最顶层 Release 中delete this。显然这不适用于堆栈对象,现在我介绍了一些我自己的崩溃。另外我的时间有点短,运行/等待崩溃/修复这个特定的崩溃方法非常慢</edit>

4

1 回答 1

0

在他的书“更有效的 C++”第 27 项中,Scott Meyers(顺便说一句,我最喜欢的 C++ 作家)描述了为什么在一般意义上和在可移植或半可移植 C++ 的范围内不可能明确区分一个对象是否已经分配在堆栈、堆上或静态分配。它还讨论了确保对象只能在堆栈或堆上分配的各种选项。其中一个或多或少是可行的,另一个没有真正便携的万无一失的工作方式;我忘了哪个是哪个。(书在工作,我在家。)

于 2012-12-05T09:46:17.297 回答