问题标签 [object-lifetime]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
asp.net-mvc-2 - ASP.NET MVC 中的请求之间是否会自动保留单例?
我有一个包含数千个整数的查找表 (LUT),我在大量请求中使用它来根据从数据库中获取的内容来计算内容。
如果我只是创建一个标准单例来保存 LUT,它是在请求之间自动持久化还是我特别需要将其推送到应用程序状态?
如果它们是自动持久化的,那么将它们与应用程序状态一起存储有什么区别?
正确的单例实现会是什么样子?它不需要延迟初始化,但它需要是线程安全的(每个服务器实例有数千个理论用户)并具有良好的性能。
编辑:Jon Skeet 的第 4 版看起来很有希望http://csharpindepth.com/Articles/General/Singleton.aspx
.net - .NET:确定对象是否对它有任何引用的方法?
问:有没有办法找出一个对象是否有任何“强引用”?
Raymond Chen 暗示可能有一个解决方案:
您想知道引用计数是零还是非零。为此,请使用弱引用。
笔记
- 我对对象有一个“弱引用”(使用WeakReference)。如果我有一个强引用 ,答案将立即是:“是的。你对这个对象有一个强引用。”
- 垃圾收集器不提供任何答案
- IsAlive 属性只能告诉您是否已收集对象。如果有强烈的引用,则不是。(没有引用的对象可能会被回收 - GC 还没有解决它)
- .NET 中的对象不被引用计数
- 并非所有对象都必须实现IDisposable接口
- 并非所有物品都是我的
代码示例
此代码示例演示了依赖强制垃圾回收和 WeakReference 的IsAlive
属性来确定对象是否有任何未完成的引用的问题。
garbage-collection - 在 GC 语言中是否有关于(或更好地使用)RAII 的研究?
注意:对象生命周期 RAII 不使用/与块范围 RAII
似乎可以使用额外的 gc 类别、短期对象(经常检查 gc 类别)、长期对象(不经常检查 gc 类别)和资源对象(非常频繁地检查 gc 类别)。或者可能为资源对象使用额外的引用计数 gc。
似乎 using/with 风格可以通过提升 I/O 的功能性风格(如果我错了,这不是功能性风格,请原谅我)阻止大量 I/O 分散在这个地方与基于对象的 RAII 的灵活性(因为它更容易)。但是有些问题可能需要很难跟踪资源的生命周期。
除了避免 gc 的复杂性和速度之外,还有其他原因没有在主流语言上完成吗?(我知道有些语言在其主要实现中使用引用计数作为 gc 的一部分,因此,RAII 可能在那里工作,但我相信他们的规范没有为某些类型的对象/或所有对象指定引用计数,并且人们使用的其他实现没有引用计数,从而限制了这些语言中对象生命周期 RAII 的使用。
PS:他们在 perl 中有 c++ 类型的 RAII 吗?
c# - C# 线程对象生命周期
假设我有如下代码:
有 2 个线程,我将把执行 Main() 函数的线程称为 Main 线程,并将在“if”测试中新建的线程称为线程 A。
我的问题是,线程 A 什么时候被销毁?doSomeLenghtyOperation() 能否完成?
由于没有指向线程 A 的引用,是否会将其标记为垃圾回收的候选对象:
- 在“new Thread().Start()”语句本身完成后立即?
- 在“if(true)”范围退出后立即?
- doSomeLengthOperation() 运行完成后?
- 绝不?
我看到的所有示例都是 Main() 持有引用,然后是 Main 线程在退出之前等待加入线程 A。我很好奇上面代码的生命周期是多少。
提前致谢!
windows - VBScript中对象的销毁顺序是什么?
.vbs 中的对象以什么顺序被销毁?
也就是说,给定这些全局变量:
我对以下任何问题的答案感兴趣。
对于在 .VBS 中实现的类的实例,将以什么顺序
Class_Terminate
调用?粗略戳建议按创建的顺序(而不是相反的顺序!),但这能保证吗?编辑:我知道
Class_Terminate
在释放对对象的最后一个引用时会调用它。我的意思是:x 和 y 会以什么顺序被释放,并且有保证吗?为简单起见,假设 x & y 是对其各自对象的唯一引用。对象的类型重要吗?例如,如果我在 .VBS 中实现了与其他 COM 对象(例如
Scripting.FileSystemObject
.编辑:我知道 COM 库可能会设置自己的内部循环引用,脚本主机引擎对此一无所知;我有兴趣探索什么会影响第一个问题的答案。
如果 x 和 y 是 Sub 或 Function 的本地而不是全局的,那么上述答案是否不同?
是否取决于退出是正常的、异常的还是通过的
WScript.Quit
?(在后一种情况下,似乎Class_Terminate
在退出之前仍然会调用任何未完成的对象,但是这些可能会导致报告错误)。WScript 对象何时被销毁?
脚本宿主重要吗?(wscript.exe 与 cscript.exe 与任何 Web 主机引擎被调用)
JScript 的对象破坏模型与 VBScript 的不同吗?
我可以凭经验找到其中一些问题的答案,但我对它们中的任何一个是否得到保证/记录感兴趣。
即使您只知道一些答案或其他相关问题,也要发布。
wcf - References for what the lifecycle is for a WCF service?
Say I have a simple WCF application that the client calls in order to get a number. There's not much processing in it and the service contract is attributed as SessionMode=SessionMode.NotAllowed.
When is the constructor called? When is the object destructed? Is a constructor called per request?
Are there any reference documents or resources that have this information? I can't seem to find it.
memcached - 如何在不获取 Memcached 项目的情况下延长它的生命周期?
我可以在不实际获取 Memcached 项目的情况下延长其生命周期吗?
当然,我可以得到该项目,再次设置它并增加寿命。但是,这样我必须先将对象复制到脚本的内存中,这从性能的角度来看并不好。
android - Android - 是 onDestroy 应该销毁活动,它的变量并释放内存
我的代码中有一个错误,让我觉得我没有完全理解 Android 生命周期。是的,我已经阅读了所有文档并查看了图表,但它们似乎只讨论何时保存数据,何时活动可能会失去焦点或被杀死。但是,我的问题是,如果我不需要保存状态,变量及其存储的值会怎样?我预计它们会被销毁,但我的代码中的一个错误似乎表明并非如此。
就我而言,这就是发生的事情。我有一个启动自定义视图的活动(没有 xml,我只是在自定义视图的屏幕上绘制位图)。我目前在我的活动中拥有的唯一变量只是我的视图变量:GameView gameView;
现在在我看来,我声明了几个位图、简单的 int 和 float 变量来处理绘图和触摸事件,并且我有一个包含小位图、每个对象的坐标和其他一些东西的对象数组。我的这个对象的类中的一个变量是一个静态变量,它表示它们是多少个对象的当前计数。我是这样做的,所以对象的实例化会导致它跟踪他们的对象是怎样的,而不是在对象的类之外跟踪它。
我希望静态变量在所有对象中保持相同的值,但我也希望一旦为该 Activity 调用 onDestroyed,该变量将与该 Activity 视图的所有其他变量和对象一起被销毁。然而,这似乎并没有发生。当此 Activity 再次启动时,此静态变量仍包含上次运行时的先前值 - 即使调用了 onDestroyed。
现在我的问题不是如何解决这个问题(我可以编写不同的代码来修复这个错误),但我想了解为什么这个静态变量会发生这种情况,因为它对整个应用程序不是全局的,它只存在于内部那个Activity的观点?此外,这让我想知道该视图中的其余变量 - 它们是否被破坏并且它们的内存被释放,或者至少它们的值在下次调用活动时不再可用,或者我是否需要自己执行此操作 - 即使我不需要保存任何这些状态数据?
感谢您对此的任何见解。
iphone - Objective-c中释放变量的正确方法
我知道在 Objective-c 中有一种非常简单的方法可以像这样声明变量:
这样,您可以在保留变量的同时将 self.myArray 用作 setter 和 getter。然而,这也将允许您做一件事,那就是避免自己使用 dealloc。据我了解,这两行是相同的:
我的问题是,哪一种是首选方式?在任何情况下,其中一个会起作用而另一个不起作用?
编辑:对不起,我的意思是释放,而不是释放......
c++ - 为什么我不能在多重继承期间动态转换“sideways”?
以下代码抛出 std::bad_cast
我记得曾经阅读过 dynamic_cast 如何权衡实现性能,因为“它遍历完整的继承格”以便正确评估。编译器在这里需要做的是先向上投射,然后再向下投射。
是否可以使上述工作或我需要添加
virtual Foo* Bar::as_foo()=0;
?