Questions tagged «destructor»

21
Java是否有析构函数?
Java是否有析构函数?我似乎无法在此找到任何文档。如果没有,我怎么能达到同样的效果? 为了使我的问题更具体,我正在编写一个处理数据的应用程序,规范中说应该有一个“重置”按钮,以将应用程序恢复为最初的启动状态。但是,除非关闭应用程序或按下重置按钮,否则所有数据都必须处于“活动”状态。 我通常是C / C ++程序员,所以我认为这是微不足道的。(因此,我计划最后实现它。)我对程序进行了结构设计,以使所有“可重置”对象都位于同一类中,以便在按下重置按钮时可以销毁所有“活动”对象。 我在想,如果我只是想取消引用数据并等待垃圾收集器来收集数据,如果我的用户重复输入数据并按下“重置”按钮,会不会发生内存泄漏?我也在想,因为Java作为一种语言已经相当成熟,所以应该有一种方法可以防止这种情况的发生或妥善解决。

9
如何正确清理Python对象?
class Package: def __init__(self): self.files = [] # ... def __del__(self): for file in self.files: os.unlink(file) __del__(self)上面的失败,并带有AttributeError异常。我了解Python在__del__()调用时不保证存在“全局变量”(在这种情况下是成员数据吗?)。如果是这种情况,并且这是导致异常的原因,那么如何确保对象正确销毁?
461 python  destructor 

7
我是否需要显式调用基本虚拟析构函数?
在C ++中(使用虚拟析构函数)覆盖类时,我在继承类上再次将析构函数实现为虚拟形式,但是我是否需要调用基本析构函数? 如果是这样的话,我想是这样的... MyChildClass::~MyChildClass() // virtual in header { // Call to base destructor... this->MyBaseClass::~MyBaseClass(); // Some destructing specific to MyChildClass } 我对吗?
350 c++  destructor 

16
从析构函数中抛出异常
大多数人说,永远不要从析构函数中抛出异常-这样做会导致未定义的行为。Stroustrup指出:“向量析构函数显式地为每个元素调用析构函数。这意味着,如果抛出一个元素析构函数,则向量破坏会失败...实际上,没有很好的方法来防止从析构函数引发的异常,因此该库不保证元素析构函数抛出异常”(来自附录E3.2)。 本文似乎另有说法-抛出析构函数或多或少是可以的。 所以我的问题是-如果从析构函数中抛出导致未定义的行为,那么如何处理析构函数期间发生的错误? 如果在清理操作期间发生错误,您是否会忽略它?如果是可以在堆栈中潜在地处理但在析构函数中无法正确处理的错误,那么将异常抛出到析构函数之外是否有意义? 显然,这类错误很少见,但可能出现。



11
指向子类的指针上的delete是否调用基类的析构函数?
我有一个class A使用堆内存分配为其字段之一。类A被实例化并作为指针字段存储在另一个类(class B。 当我完成了类B的对象时,我会调用delete,我假设它调用了析构函数...但是这是否也调用了类A的析构函数? 编辑: 从答案中,我认为(如果不正确,请编辑): delete B实例的调用B ::〜B(); 哪个电话 A::~A(); A::~A 应该显式地deleteA对象的所有堆分配的成员变量; 最终,将存储该类B实例的内存块返回到堆-当使用new时,它首先在堆上分配一个内存块,然后调用构造函数对其进行初始化,现在在所有析构函数都被调用以最终确定对象之后对象所在的块返回到堆。


12
为什么我们需要C ++中的纯虚拟析构函数?
我了解需要虚拟析构函数。但是为什么我们需要一个纯虚拟析构函数?在一篇C ++文章中,作者提到了当我们要使类抽象时,我们使用纯虚拟析构函数。 但是我们可以通过将任何成员函数设为纯虚函数来使类抽象。 所以我的问题是 我们什么时候才能真正使析构函数成为纯虚拟的?有人可以举一个很好的实时例子吗? 当我们创建抽象类时,将析构函数也设置成纯虚拟的是一种好习惯吗?如果是..那为什么呢?

6
如何销毁物体?
据我所知(很少),给出了两种方法: $var = new object() 然后: // Method 1: Set to null $var = null; // Method 2: Unset unset($var); 其他更好的方法?我在这里劈头发吗?

10
什么时候调用C ++析构函数?
基本问题:程序何时在C ++中调用类的析构函数方法?有人告诉我,只要对象超出范围或受到delete 更具体的问题: 1)如果对象是通过指针创建的,并且该指针后来被删除或提供了指向的新地址,那么指向该对象的对象是否调用其析构函数(假设没有其他对象指向该析构函数)? 2)跟进问题1,由什么定义对象何时超出范围(与对象何时离开给定的{block}无关)。因此,换句话说,何时在链接列表中的对象上调用析构函数? 3)您是否想手动调用析构函数?
117 c++  destructor 

7
在C#中使用IDisposable和析构函数有什么区别?
什么时候在类而不是析构函数上实现IDispose?我读了这篇文章,但是我仍然没有抓住重点。 我的假设是,如果我在对象上实现IDispose,则可以显式地“销毁”该对象,而不是等待垃圾回收器执行此操作。这样对吗? 这是否意味着我应该始终在对象上显式调用Dispose?常见的例子有哪些?
101 c#  .net  dispose  destructor 

3
在C#中,类中的析构函数和Finalize方法之间有什么区别?
类中的析构函数和Finalize方法之间有什么区别(如果有)? 我最近发现Visual Studio 2008将析构函数视为Finalize方法的同义词,这意味着Visual Studio不允许您同时在类中定义这两个方法。 例如,以下代码片段: class TestFinalize { ~TestFinalize() { Finalize(); } public bool Finalize() { return true; } } 调用析构函数中的Finalize时出现以下错误: 该调用在以下方法或属性之间是不明确的:'​​TestFinalize。〜TestFinalize()'和'TestFinalize.Finalize()' 并且,如果对Finalize的调用已被注释掉,则会出现以下错误: 类型“ ManagementConcepts.Service.TestFinalize”已经定义了具有相同参数类型的名为“ Finalize”的成员

2
GNU GCC(g ++):为什么会生成多个dtor?
开发环境:GNU GCC(g ++)4.1.2 当我试图研究如何在单元测试中增加“代码覆盖率-特别是功能覆盖率”时,我发现某些类dtor似乎会多次生成。你们当中有人对为什么有任何想法吗? 我尝试并使用以下代码观察了上面提到的内容。 在“ test.h”中 class BaseClass { public: ~BaseClass(); void someMethod(); }; class DerivedClass : public BaseClass { public: virtual ~DerivedClass(); virtual void someMethod(); }; 在“ test.cpp”中 #include <iostream> #include "test.h" BaseClass::~BaseClass() { std::cout << "BaseClass dtor invoked" << std::endl; } void BaseClass::someMethod() { std::cout << "Base …
89 c++  g++  destructor 

3
shared_ptr魔术:)
利德斯特罗姆先生和我有一个论点:) Lidström先生的主张是,构造shared_ptr<Base> p(new Derived);不需要Base具有虚拟析构函数: Armen Tsirunyan:“真的吗?shared_ptr会正确清理吗?在这种情况下,请您演示一下如何实现这种效果?” DanielLidström:“ shared_ptr使用其自己的析构函数来删除Concrete实例。在C ++社区中被称为RAII。我的建议是,您将学习到有关RAII的全部知识。它将使您使用C ++的代码如此容易在任何情况下都可以使用RAII。” Armen Tsirunyan:“我了解RAII,而且我也知道,最终pn达到0时,shared_ptr析构函数可能会删除存储的px。但是,如果px具有指向的静态类型指针Base和动态类型的指针Derived,则除非Base具有虚拟析构函数,否则会导致不确定的行为。如果我做错了,请纠正我。” DanielLidström:“ shared_ptr知道静态类型是Concrete。自从我在其构造函数中传递它以来,它就知道这一点!看起来有点像魔术,但是我可以向您保证,它是设计使然,非常好。” 所以,判断我们。在不要求多态类具有虚拟析构函数的情况下,如何(如果可能)实现shared_ptr?提前致谢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.