我不确定这是否可行。
我需要阻止从X派生的所有类被实例化为本地堆栈或成员变量。我使所有的析构函数都受到保护,就外部作用域而言,这就成了伎俩。但是,我也需要防止它们被自己实例化。我的意思是如果Y具有Z类型的成员变量或者在其方法中实例化Z类型的局部变量,那么它不会削减它。
现在我可以在层次结构树的所有叶子中创建私有析构函数,但问题是每个都不应该被允许成为(堆)变量。在X< -Y< -Z的情况下,所有三个都应该被实例化,但是X和Y不能具有私有析构函数。而且即使这样也不会阻止我在Z的方法中使用Z型的局部变量。
我想通过使他们的构造函数私有并将operator new添加为所有人的朋友将会有所作为,但这是一项额外的工作(因为我们使用了几个版本的operator new)并且层次结构很大。 / p>
那么,是否有一种方法可以在这些对象的堆栈实例化中使用(最好)编译时或运行时错误,而不采用private-constructors-friend-new-way?
<编辑>
问题在于,该项目的前几个程序员编写了大量代码,并且此层次结构中的所有类都具有非常复杂的析构函数。此外,作者在这些破坏者中不加区分地称为虚拟方法,这导致了许多无法解释的(对他们而言)崩溃和内存损坏。现在将所有析构函数转换为obj->Release()
模式,并在最顶层版本中将delete this
转换为{{1}}。显然这对堆栈对象不起作用,现在我介绍了一些我自己的崩溃。另外我有点时间和运行/等待崩溃/修复这个特定的崩溃方法非常慢
< /编辑>
答案 0 :(得分:0)
在第27项的“更有效的C ++”一书中,Scott Meyers(顺便说一句,我在C ++上最喜欢的作者)描述了为什么在一般意义上以及在便携式或半便携式C ++的范围内无法明确区分是否存在对象已在堆栈,堆上分配,或者是静态分配的。它还讨论了确保对象只能在堆栈上或堆上分配的各种选项。其中一个或多或少可行,另一个没有真正便携的万无一失的工作方式;我忘了哪个是哪个。 (书在工作,我在家。)