![]() |
1
217
C++ FAQLite有一个专门针对这个的条目 我认为这句话概括得很好
|
![]() |
2
75
对,
这倾向于支持标准所考虑的观点
不管怎样,有些人认为
你使用这种技术的主要时间是和一个几乎完全拥有自己生命的物体在一起。JamesKanze引用的一个例子是他为一家电话公司工作的计费/跟踪系统。当你开始打电话时,一些东西会注意到这一点,并创建一个
对于任何一个关心这种编码有多可靠的人来说:如果你在欧洲的任何地方打电话,或者从欧洲的任何地方打电话,很有可能它正是由这样的代码处理的(至少部分)。 |
![]() |
3
44
如果它吓到了你,就有一个完全合法的黑客:
我想
在这种情况下,这个构造实际上是有用的——您可以在抛出需要对象成员数据的异常之后删除该对象。该对象在引发之前保持有效。
注意:如果使用比C++ 11大的编译器,则可以使用
|
![]() |
4
22
C++被设计的原因之一是使代码易于重用。一般来说,C++应该被编写,以使该类在堆、数组或堆栈上实例化。删除这个“是一个非常糟糕的编码实践,因为只有在堆上定义了一个实例时,它才会起作用;最好不要有另一个delete语句,这通常是大多数开发人员用来清理堆的。这样做还假设将来没有维护程序员会通过添加一条DELETE语句来修复错误感知的内存泄漏。 即使您事先知道您当前的计划是只在堆上分配一个实例,如果将来某个幸运的开发人员来了,并决定在堆栈上创建一个实例呢?或者,如果他将类的某些部分剪切并粘贴到一个他打算在堆栈上使用的新类,该怎么办?当代码达到“删除这个”时,它将关闭并删除它,但当对象超出范围时,它将调用析构函数。然后,析构函数将再次尝试删除它,然后您将被托管。在过去,这样做不仅会破坏程序,而且需要重新启动操作系统和计算机。在任何情况下,强烈建议不要这样做,而且几乎应始终避免这样做。我必须绝望,认真地粉饰,或者真的恨我为之工作的公司写这样的代码。 |
![]() |
5
19
这是允许的(之后不要使用对象),但我不会在实践中编写这样的代码。我认为
|
![]() |
6
13
嗯,在组件对象模型(COM)中
|
![]() |
7
7
你可以这样做。但是,您不能分配给它。因此,你说这样做的原因,“我想改变看法”,似乎很可疑。在我看来,更好的方法是让持有视图的对象替换该视图。 当然,你使用的是raii对象,所以你根本不需要调用delete…对吧? |
![]() |
8
6
这是引用计数对象的核心习语。 引用计数是确定性垃圾收集的一种强大形式——它确保对象管理自己的生命周期,而不是依赖“智能”指针等来为其执行此操作。底层对象只能通过“引用”智能指针访问,其设计使指针在实际对象中递增和递减成员整数(引用计数)。 当最后一个引用从堆栈中除去或被删除时,引用计数将变为零。然后,对象的默认行为将是调用“delete this”进行垃圾收集-我编写的库在基类中提供了一个受保护的虚拟“countiszero”调用,以便您可以为缓存等操作重写此行为。 使此安全的关键是不允许用户访问有问题的对象的构造函数(使其受保护),而是让他们调用一些静态成员-工厂-如“static reference createt(…)”。这样,您就可以确定它们总是用普通的“new”构建的,并且没有原始指针可用,所以“delete this”永远不会爆炸。 |
![]() |
9
3
这是一个古老的,有人回答的问题,但是@Alexandre问:“为什么会有人想这样做?”我想我可以提供一个我今天下午考虑的示例用法。 遗留代码。使用裸指针obj*obj,并在末尾使用delete obj。 不幸的是,我有时需要,而不是经常,让物体活得更长。
我正在考虑让它成为一个参考计数的智能指针。但是会有
太多了
如果我要使用
所以我正在考虑创建一个显式的删除指针。即引用计数指针,其中删除仅在显式删除例程中完成。在现有代码知道对象生存期的地方使用它,在我的新代码中使用它可以使对象保持更长的生存期。 增加和减少引用计数,作为显式的“删除”参数。 但如果在显式“删除”析构函数中的引用计数为零,则不会释放。 仅当在显式类似于删除的操作中,引用计数为零时才释放。例如:
好吧,差不多。引用计数指针类型不自动删除rc'ed ptr析构函数中指向的对象是有点不寻常的。但这似乎会使混合裸指针和RC'ED指针更加安全。 但到目前为止还没有必要删除这个。 但我突然想到:如果指向的对象指针知道它正在被引用计数,例如,如果计数在对象内部(或在其他表中),那么例程delete_if_r rc0可以是指针对象的方法,而不是(智能)指针。
实际上,它根本不需要是成员方法,但可以是自由函数:
(顺便说一句,我知道代码不太正确——如果我添加所有的细节,代码就变得不那么可读了,所以我就这样离开它。) |
![]() |
10
0
删除只要对象在堆中,这是合法的。 您需要只要求对象是堆。 唯一的方法是使析构函数受到保护-这样,只能从类中调用delete,因此需要一个确保删除的方法 |