释放安卓应用中的共享资源
我正在编写具有活动和服务组件的Android应用程序.此外,我有一个类封装了我在活动和服务中的几个地方共享的资源.我的问题是我如何弄清楚何时释放资源.据我了解,Java没有灾难的概念,因此我不能仅仅在共享对象中创建destuructor,而当不再有对对象的引用时,它将被调用. Android具有诸如活动的Onpause之类的功能,而该服务的OnDestroy却没有技术,尽管从技术上讲,不能保证在所有可能的关闭情况下都会调用这些功能中的任何一个(例如,低内存杀手不会调用这些功能).无论如何,活动可能会被销毁而不会破坏服务,在这种情况下,仍然可能会参考资源,因此在这种情况下,我也不能盲目释放资源. 由于Java没有破坏者,一些消息来源说创建自己的" close()"类型功能并将其称为手动称呼.但是似乎要这样做,我必须维护自己的参考计数方案,考虑到Java已经拥有GC,这似乎很奇怪,这应该消除对这种方案的需求. 这里的正确解决方案是什么? 解决方案 答案是否. 您必须
0 2024-02-06
编程技术问答社区
内部.Net框架数据提供者错误1
我正在开发一个带有Visual Studio 2012 Ultimate Edition的Winform应用程序,所有服务包,C#和.NET Framework 4.5. 我得到这个例外: Internal .Net Framework Data Provider error 1 使用此堆栈: en System.Data.ProviderBase.DbConnectionInternal.PrePush(Object expectedOwner) en System.Data.ProviderBase.DbConnectionPool.PutObject(DbConnectionInternal obj, Object owningObject) en System.Data.ProviderBase.DbConnectionInternal.CloseConnection(DbConnection owningObject, DbConnect
6 2024-01-19
编程技术问答社区
使用JQuery,当一个DOM元素调用.remove()时,是否有可能让一个函数运行?
正如问题所述,我试图做的是具有从DOM中删除DOM元素的函数,就像Destructor一样. 我调查了卸载,但是从我的理解中,只有当浏览器从页面上导航时才会调用. 预先感谢! 解决方案 我不知道这是否是您想要的.不是真的很漂亮的代码,只是为了显示我想使用的内容: // Just for this script's sake, you'll want to do it differently var body = $("body"); var element = $('#loadingBlock'); // Bind the "destructor" firing event body.bind("elementDeleted", function (element) { // your "destructor" code }); // Trigger the event, delete element, can be placed in a functi
0 2024-01-16
编程技术问答社区
ABSTRACT类型的Fortran FINAL程序
我可以在抽象类型中添加final过程吗? 假设最终过程看起来像这样: subroutine finalize(this) type(bin_tree_t), intent(inout) :: this deallocate(this%head) end subroutine finalize 我的编译器(IFORT 18.0.1)给出"错误#8313:类型(派生型式规格)不得指定抽象类型".我明白了,但是最后一个子例程的虚拟论点不能是多态性的. 如果这是不可能的,那么这可能是标准委员会的有意识选择,还是只是一个监督? 解决方案 抽象类型不可能具有最终的子例程.正如您所指出的那样,这种子例程的论点一定不能是多态,我们不能用type(spec)>. 实例化抽象类型. 最终确定对象时,最终的子例程是一个参数类型的 dynamic 要敲定的对象类型.没有对象可以具有动态类型的抽象类型.最终子例程没有继承(并且可能不会被覆盖). 我可以想象
4 2024-01-09
编程技术问答社区
抽象类的析构器应该是纯虚拟的吗?
我认为仅虚拟通常就足够了. 是否有另一个理由使它变得纯粹是虚拟的,而不是强迫派生的阶级实施自己的驱动器?我的意思是,如果您在班级中分配某些东西'课程是否派生. 不算作我已经知道的答案:如果您想要摘要且没有纯虚拟函数 - 将其留给Destructor. 更多用途? 解决方案 如果您想要班级摘要,并且 没有纯虚拟功能 - 离开 实际上,我认为没有更多.所有纯虚拟破坏者所做的就是使整个班级抽象.您必须为纯虚拟破坏者以及非伪虚拟破坏者提供实现,派生类的破坏者是虚拟的,仅具有虚拟驱动器等,等等. . 基本上,如果一个类已经具有一些纯虚拟功能,则其行为将等效于虚拟和纯虚拟的破坏者. 其他解决方案 否.如果基类分配任何内容,则释放它是责任. 此外,如果派生的类没有任何东西,则迫使他们写虚拟dtor是没有意义的. 其他解决方案 理想情况下,语言应该有一种方法来确保(是否暗中),destuructor在抽象类中实际上是虚拟的,而无需定义或使
0 2024-01-09
编程技术问答社区
C++抽象类的析构器
是很好的做法(并且有可能)仅在父级中使用纯虚拟破坏者创建抽象类吗? 这是一个样本 class AbstractBase { public: AbstractBase () {} virtual ~AbstractBase () = 0; }; class Derived : public AbstractBase { public: Derived() {} virtual ~Derived() {} }; 否则,如果衍生物类的属性和构造函数都相同,而其他方法完全不同? ,我该如何创建抽象类? 解决方案 在基类中只有纯虚拟破坏者是一个很好的做法,但在某些情况下是可能的. 例如,如果您依靠RTTI通过尝试在基类的指针上尝试Dynamic_cast来将消息分配给子类对象,则除destructor以外,您可能在基类中不需要方法.在这种情况下,将驱动器公开虚拟化. 由于您没有其他虚拟方法,除了破坏者外,因此必须使其纯净以防止基类
0 2024-01-09
编程技术问答社区
为什么Finalize/Destructor的例子在.NET Core中不起作用?
我正在尝试学习最终化和destructor在C#中的工作方式,我尝试在 System.Object.Finalize 示例(代码复制,未进行更改),但输出与预期不相同从来没有称呼. 代码是: using System; using System.Diagnostics; public class ExampleClass { Stopwatch sw; public ExampleClass() { sw = Stopwatch.StartNew(); Console.WriteLine("Instantiated object"); } public void ShowDuration() { Console.WriteLine("This instance of {0} has been in existence for {1}", this, sw.E
0 2024-01-08
编程技术问答社区
为什么在这种非常简单的情况下,我的.net析构器不被调用?
我有以下代码: public class A { ~A() { Console.WriteLine("destructor"); } } public static A Aref; static void Main(string[] args) { Aref = new A(); int gen = GC.GetGeneration(Aref); Aref = null; GC.Collect(gen, GCCollectionMode.Forced); Console.WriteLine("GC done"); } 我认为我的最终方法会在我致电GC.Collect时被要求. 谁能解释我为什么? 解决方案 GC.Collect()返回之前未调用结尾器.结尾器是在单独的线程中
2 2024-01-06
编程技术问答社区
当本地(C++)异常传播到CLR组件时,不调用析构器
我们有大量的本机C ++代码,被填充到dll中. 然后,我们有几个包含C ++/CLI代理代码的DLL来包装C ++接口. 最重要的是,我们将C#代码呼叫到C ++/CLI包装器中. 到目前为止的标准内容. 但是,我们有很多情况下,本机C ++例外可以传播到.NET世界,并且我们依靠.NET将其包裹为系统的能力.Exception对象,并且在大多数情况下都可以正常工作. 但是,我们一直在发现,当异常传播时,在投掷点处的对象的破坏者并没有被调用! 经过一些研究,我们发现这是一个众所周知的问题.但是,解决方案/解决方法似乎不那么一致.我们确实发现,如果用/eha而不是/ehsc编译本机代码,则问题消失了(至少在我们的测试案例中确实如此).但是,当我们将SEH例外转换为C ++例外时,我们非常希望使用/eHSC,我们宁愿允许编译器更多以进行优化. 此问题还有其他解决方法 - 除了在(本机)try-catch-throw中包裹本机管理的每个呼叫(除了C ++
2 2024-01-05
编程技术问答社区
当本地(C++)异常传播到CLR组件时,不调用析构器
我们有大量的本机C ++代码,被填充到dll中. 然后,我们有几个包含C ++/CLI代理代码的DLL来包装C ++接口. 最重要的是,我们将C#代码呼叫到C ++/CLI包装器中. 到目前为止的标准内容. 但是,我们有很多情况下,本机C ++例外可以传播到.NET世界,并且我们依靠.NET将其包裹为系统的能力.Exception对象,并且在大多数情况下都可以正常工作. 但是,我们一直在发现,当异常传播时,在投掷点处的对象的破坏者并没有被调用! 经过一些研究,我们发现这是一个众所周知的问题.但是,解决方案/解决方法似乎不那么一致.我们确实发现,如果用/eha而不是/ehsc编译本机代码,则问题消失了(至少在我们的测试案例中确实如此).但是,当我们将SEH例外转换为C ++例外时,我们非常希望使用/eHSC,我们宁愿允许编译器更多以进行优化. 此问题还有其他解决方法 - 除了在(本机)try-catch-throw中包裹本机管理的每个呼叫(除了C ++
4 2024-01-05
编程技术问答社区
解构器和垃圾收集器的区别
我想知道,在应用程序生命的结束时,使用破坏者和垃圾收集器之间有任何区别,用于处理所有未使用的物体,使用垃圾收集器也可以手动使用垃圾收集器在应用程序末尾调用或完成,与破坏者相同,两者都是可选的,并且用于处理未引用的对象,任何人都可以指出我的确切差异 解决方案 垃圾收集器和最终变性器/灾难固有链接 - 但是,大多数对象不需要(也不具有)破坏者.实际上,它们在托管代码中非常罕见,通常用于确保发布非管理资源.如果对象具有击曲线/最终化器,则垃圾收集器将与收藏的同一时间调用(也许在下一个通行证中).垃圾收集是非确定性的 - 发生在发生时发生 - 通常与记忆压力有关. 但是,更常见的是可见的.这允许更可预测的模式发布资源现在(而不是在GC下一步发生时).通常,具有最终制度的类也将 都可以使用,而Dispose()实现都禁用了灾难(如果我们已经清理了,则不需要).请注意,Dispose()与垃圾收集无关,但通过"使用"语句提供语言支持. iDisposable是 比最终化更常见的.
10 2024-01-04
编程技术问答社区
.NET中的C#类何时调用析构器?
说,我有自己的c#类定义: public class MyClass { public MyClass() { //Do the work } ~MyClass() { //Destructor } } 然后我从ASP.NET项目创建了我的类实例,因此: if(true) { MyClass c = new MyClass(); //Do some work with 'c' //Shouldn't destructor for 'c' be called here? } //Continue on 我希望在if范围的末尾被调用,但它从未被调用.我想念什么? 解决方案 等效于C ++破坏者是IDisposable,而Dispose()方法通常在using块中使用. 参见 http://msdn.microsoft/library/system.id
2 2024-01-04
编程技术问答社区
破坏器--如果应用程序崩溃,它是否被调用
如果应用程序崩溃,destructor是否会被调用?如果我猜这是一个没有指责的例外,但是更严重的错误或杀死申请过程的用户之类的东西呢? 和一些更可能的愚蠢问题: 当应用程序退出和所有最终化器已执行时,应用程序中的所有对象会发生什么 - 对象收集垃圾,还是在某种程度上通过过程或AppDomain"卸载"了垃圾? 是每个应用程序的垃圾收集器部分(在同一过程中运行)还是独立的? 解决方案 我鼓励您自己尝试.例如: using System; class Program { static void Main(string[] args) { var t = new Test(); throw new Exception("kaboom"); } } class Test { ~Test() { Console.WriteLine("finalizer called"); } } 在命令提示符下运行此功能,以便您可以看到最后一个喘气.首
10 2024-01-04
编程技术问答社区
静态终结者
执行一些静态最终化的正确方法是什么? 没有静态破坏者. AppDomain.DomainUnload事件未在默认域中提出. AppDomain.ProcessExit事件共享所有事件处理程序之间三秒钟(默认设置)的总时间,因此它并不是真正可用的. 解决方案 基本上,您不能.最大程度地设计自己的方式. 不要忘记一个程序总是可以总是突然终止 - 有人拔出力量是显而易见的例子.因此,您所做的任何事情都必须是"最好的努力" - 在这种情况下,我当然希望 AppDomain.ProcessExit就足够了. 在您的特殊情况下,您需要做什么? 其他解决方案 Herfried Wagner写了 我已经尝试过: static readonly Finalizer finalizer = new Finalizer(); sealed class Finalizer { ~Finalizer() { Thread.Sleep(1000);
8 2024-01-03
编程技术问答社区
在我的析构器中释放Excel对象
我正在使用Microsoft.interropt.excel dll编写Excel类. 我完成了所有功能,但我的击曲线有错误. 我想将所有更改保存到我的文件中,我想发布所有源.我想把它们全部放在我的破坏者中. 但是在我的destructor中,Excel.ApplicationClass,Workbook和Worksheet对象的异常填充,该消息具有"无法使用已与其基础RCW分开的COM对象". 所以我什么也不能保存,没有关闭,因为我无法访问工作簿或工作表对象. 我不能访问destructor中的私人成员吗? 解决方案 .NET所谓的最终变成最终确定器.主要区别在于,驱动器通常具有确定性的终结(例如,当对象的参考计数为零时),而在不再引用该对象后的 denterizer在 不确定的时间上调用. .这是由.NET垃圾收集器使用Roots追踪过程来处理的,而不是使用简单的参考计数. 最好的文章之一是垃圾集合:Microsoft .NET框架中的自动内存管理.有关最终化器的
0 2024-01-03
编程技术问答社区
为什么结构体不能有析构器?
在您认为的这样的问题上,面试中最好的答案是什么? 我认为我在这里没有找到此副本,如果有一个,请链接它. 解决方案 另一种看待这一点的方式 - 而不仅仅是引用说明结构不能/没有破坏者的规格 - 考虑如果更改规格会发生什么,以便他们这样做 - 或者更确切地说,更确切地说,让我们问一个问题:我们可以猜测为什么语言设计师决定首先不允许结构具有"破坏者"? (在这里不要挂在" destructor"一词上;我们基本上是在构造上的魔法方法,该方法在变量不存在时会自动调用.换句话说,一种类似于类似的语言功能C ++的破坏者.) 要意识到的第一件事是,我们不在乎发布记忆.无论该对象是在堆栈上还是在堆上(例如,班级中的一个结构),记忆将迟早或迟到一种或另一种方式;通过从堆栈中弹出或被收集.首先,拥有类似势力的东西的真正原因是管理外部资源 - 诸如文件句柄,窗口手柄或其他需要特殊处理以使其清理CLR的事物之类的东西本身不知道. 现在认为您允许结构具有可以进行此清理功能的破坏者
2 2024-01-03
编程技术问答社区
为什么.NET中没有RAII?
主要是C ++开发人员,缺乏 raii(资源获取是初始化) .NET一直困扰着我.清理责任从班级作家转移到消费者的事实(通过try finally或.net的 using构造)似乎很明显. 我明白了为什么在Java中不支持RAII,因为所有对象都位于堆上,而垃圾收集器本质上不支持确定性的破坏,而是随着引入值类型(struct)的.我们有RAII的(看似)完美的候选人.可以使用堆栈上创建的值类型具有明确的范围,并且可以使用C ++驱动器语义.但是,CLR不允许值类型具有破坏者. 我的随机搜索发现了一个论点,即如果值型为盒装在垃圾收集器的管辖下,其破坏变成了非确定性. 我觉得这个论点不够强烈,RAII的好处足够大,可以说具有攻击函数的价值类型无法装箱(或用作班级成员). 要剪掉一个长话短说,我的问题是:为了将RAII引入.NET是否可以使用其他原因值类型? (或者您认为我关于Raii明显优势的论点是有缺陷的吗?) 编辑:我一定没有清楚地提出问题,因为前四个答案错过了重
2 2024-01-03
编程技术问答社区
销毁器、处置和最终确定方法之间的区别
我正在研究垃圾收集器在C#中的工作方式.我对使用Destructor,Dispose和Finalize方法感到困惑. 根据我的研究和理解,在我的班级中使用驱动器方法会告诉垃圾收集器以destuructor方法中提到的方式执行垃圾收集,该垃圾收集在班级实例上无法明确称为. Dispose方法旨在为用户提供控制垃圾收集. Finalize方法可以释放班级使用的资源,但不能释放对象本身. 我不确定是否正确理解它.请澄清疑问.欢迎任何其他链接或指南. 解决方案 destructor隐式调用最终方法,从技术上讲它们是相同的.可以使用实现Idisposable接口的对象. 您可能会看到: destructors"> destructors c# -MSDN destructor隐式调用在该基类的基准上确定 对象. 来自同一链接的示例: class Car { ~Car() // destructor { // cle
8 2024-01-02
编程技术问答社区
在C#中,使用IDisposable与destructor的区别是什么?
我什么时候在班级上实施iDispose,而不是灾难?我阅读这篇文章 . 我的假设是,如果我在对象上实现IDISPOSE,我可以明确地"破坏"它,而不是等待垃圾收集器来做.这是正确的吗? 这是否意味着我应该始终明确调用对象上的拨动?有哪些常见示例? 解决方案 最终化器(又称驱动器)是垃圾收集(GC)的一部分 - 当发生(或甚至)发生时,它是不确定的,因为GC主要是由于内存压力而发生的(即需要更多空间).最终化器通常仅用于清理非托管资源,因为托管资源将具有自己的收集/处置. 因此,IDisposable用于确定性清除对象,即现在.它不会收集对象的内存(仍然属于GC) - 但用于关闭文件,数据库连接等. . 以前有很多主题: 确定性最终确定 处置对象 使用块 resources 最后,请注意,IDisposable对象也具有最终确定器并不少见.在这种情况下,Dispose()通常调用GC.SuppressFinalize(this),这意味着GC
4 2024-01-02
编程技术问答社区
基于try/finally+ yield的Python析构器?
我一直在测试一个受此 class Foo(): def __init__(self): self.__res_mgr__ = self.__acquire_resources__() self.__res_mgr__.next() def __acquire_resources__(self): try: # Acquire some resources here print "Initialize" self.f = 1 yield finally: # Release the resources here print "Releasing Resources" self.f = 0 f = Foo() print "testing resources" print f.f ,但它总是给我的: Initialize testing resource
2 2023-12-25
编程技术问答社区