问题标签 [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.

0 投票
5 回答
720 浏览

c# - 我可以让 C# 对象的生命周期依赖于另一个对象吗?

我有一个对象(委托)需要保持活动状态(不是垃圾收集),而另一个对象(目标对象)是活动的。我希望在收集 TargetObject 时对 Delegate 进行垃圾收集(或至少可用于收集)。

困难在于我不想从 TargetObject 引用 Delegate,因为我希望它适用于不知道 Delegate 的现有对象,并且我不想影响 TargetObject 的生命周期。这是可能吗?

谢谢。

编辑:感谢到目前为止的回复。我会尽量澄清我在做什么。

我正在尝试实现弱事件,但我不是 WeakEventManager(尤其是 IWeakEventListener)的粉丝。我想持有对指向对象 TargetObject 中的方法的委托事件处理程序 (Delegate) 的弱引用。在 TargetObject 存活时需要对 Delegate 进行强引用以保持 Delegate 存活,但如果生命周期较长的东西引用 Delegate,它会使 TargetObject 保持存活(违背了弱事件的目的)。

如果订阅弱事件的对象不必具有任何特殊的实现细节(例如必须保留委托集合),那就太好了。

编辑编辑:将“A”更改为“Delegate”,将“B”更改为“TargetObject”

0 投票
4 回答
2293 浏览

c++ - 这个 C++ 临时绑定到引用成员是否应该是非法的?

我的问题(这将在此之后出现,对于冗长的介绍感到抱歉,问题在下面以粗体显示)最初是受到 Herb Sutters Exceptional C++中的第 23 项的启发,我们在其中找到了类似的内容:
<snip>

</snip>

现在,我对该代码有以下问题(不,我毫不怀疑 Sutter 先生作为 C++ 专家的能力):

    1. 像这样的例子是行不通的,因为 GTAClient& worker 是一个非常量引用,不能临时引用,但是好吧,它可能是按标准编写的或者是错字,无论如何,这不是我的意思。
    2. 让我想知道的是他将如何处理工人参考,即使问题 1. 被忽略。
      显然本意是用在通过(多态)接口访问MyWorker的NVI中;这排除了实现拥有 type 的(值)成员,因为这会导致切片等。值语义不能与多态性很好地混合。 它也不能具有类型的数据成员,因为该类对于. 所以我得出结论,它一定是通过指针或引用来使用的,保留了原始对象和多态性。GenericTableAlgorithmGTAClientGTAClient
      MyWorkerGenericTableAlgorithm
    3. 由于指向临时对象MyWorker()pimpl_. (注意:GTAClient 中也没有 clone-member 函数,它可以完成这项工作;我们不要假设有一个基于 RTTI-typeinfo 的工厂潜伏在后台。
      在这里(终于!)我的问题是: (如何)可以合法地将临时 to 传递给具有延长生命周期的类的引用成员?


    §12.2.5 中的标准(C++0x 版本,但在 C++ 中相同,不知道章号)从生命周期扩展中产生以下异常: “-A 临时绑定到构造函数中的引用成员ctor-initializer (12.6.2) 一直存在,直到构造函数退出。”

    因此该对象不能用于调用客户端代码a.Process(); 因为引用的临时 fromMyWorker()已经死了!

    现在考虑一个我自己制作的示例来演示该问题(在 GCC4.2 上测试):

    产生输出

    您可以看到,在const oogie& ref的情况下,func() 的立即绑定到引用的临时返回值具有所述引用的延长生命周期(直到 main 结束),所以没关系。
    但是: 1000-oogie 对象在 kangoo-s 被构建后就已经被销毁了。代码有效,但我们在这里处理的是一个不死物体......

    所以再次提出这个问题:
    首先,我在这里遗漏了什么并且代码是正确/合法的吗?.
    其次,为什么 GCC 没有给我任何警告,即使指定了 -Wall ?应该是?可以吗?

    谢谢你的时间,
    马丁

  • 0 投票
    1 回答
    4915 浏览

    java - 使用 Google Guice 进行生命周期管理

    是否有推荐的模式来关闭/关闭使用 Guice 创建的对象?

    我的目标生命周期是:

    1. 准备一个 Guice 模块
    2. 创建注入器
    3. 通过您的代码使用注入器来获取对象 ( injector.getInstance(Foo.class))
    4. ...
    5. 关闭所述对象持有的任何资源(文件句柄、TCP 连接等)。我希望这是一个确定性步骤(而不是“GC 运行的某一天”)。
    0 投票
    4 回答
    1722 浏览

    wcf - WCF 服务中的 Linq to Sql DataContext 生命周期

    我有一个通过 WCF 公开的服务。该服务公开了几种通过 Linq to SQL 数据上下文与数据库对话的方法。数据上下文绑定到 CallContext。所有这一切都在正常工作,但我无法确定将 Linq to SQL 数据上下文配置的正确位置。请帮忙。

    0 投票
    5 回答
    531 浏览

    c++ - 在全局单例对象中存储 COM 指针的问题

    背景

    我正在使用的应用程序有几个 COM DLL。

    其中一个 COM DLL 有一个全局单例对象,它存储指向其他 DLL 中 COM 接口的指针。因为它是一个全局单例对象,所以我使用了惰性初始化习惯用法,因为我试图获取指针的接口可能存在于尚未加载的 DLL 中。

    旁注:这在注册单个 DLL 时尤其重要,因为全局对象将在regsvr32进程中构建,我不希望 DLL 在此过程中尝试获取到另一个 DLL 的接口。)

    例如,我的惰性初始化方法会做这样的事情:

    注意: m_pMyOtherObjectCComPtr类型的成员变量。

    延迟初始化可能与我的问题无关,但为了完整起见,我将其包括在内。

    问题

    我注意到的是,在某些情况下,当我的应用程序关闭时,我会收到失败的断言。但是,如果我将代码更改为QueryInterface() 每次需要访问时调用IID_IMyOtherOBject(而不是将其存储为成员变量),这会阻止断言。

    在我看来,这似乎是一个 COM 对象生命周期问题。我的假设是,因为我是storing一个 COM 指针,所以在我指向的 COM 接口的破坏和我自己指向它的指针之间需要某种同步。

    我对这个CComPtr类(我正在使用)的理解是,它消除了处理生命周期问题(即调用AddRef()and Release())的很多麻烦。但它似乎不适用于我的情况。

    谁能选择我可能做错了什么?

    0 投票
    1 回答
    282 浏览

    c# - mvc涡轮机的生命周期管理?

    如何在 mvc 涡轮机中管理我的服务的生命周期(使用 Unity)?

    我有一个 ISearchService 实现 LuceneSearchService,它采用 IConfigurationService 和 ILoggerService。

    目前我的搜索服务注册如下所示:

    我想继续负责在 Turbine 中创建实例,但我希望它是一个单例。

    或者换句话说,我如何定义生命周期?

    0 投票
    2 回答
    4090 浏览

    c# - 为什么Unity发起的这个实例不是单例?

    在我的 asp.net-mvc 应用程序中,我有一个调用静态 CreateContainer() 方法的 statis MvcApplication。

    在这种方法中,我创建了我的统一 ioc 容器:

    如果我很好地理解了我的来源,这应该给我一个单例 LuceneSearchService 实例。然而,在我的日志记录中,我可以看到每次请求此实例时我的构造函数都会被命中。

    我究竟做错了什么?

    0 投票
    2 回答
    2659 浏览

    python - __del__ 方法在 python 中被调用而不是预期的

    我是 python 新手,一直在研究 Swaroop CH 的“A Byte of Python”中的示例。我看到一些__del__让我困惑的方法的行为。

    基本上,如果我运行以下脚本(在 Python 2.6.2 中)

    使用 Python 控制台(或 Spyder 交互式控制台)我看到以下内容:

    execfile(u'C:\1_eric\Python\test1.py')
    初始化 Swaroop
    初始化 Kalem

    execfile(u'C:\1_eric\Python\test1.py')
    Initializing Swaroop
    Swaroop 说再见
    我是最后一个
    Initializing Kalem
    Kalem 说再见
    我是最后一个

    为什么在第二次运行__del__之后立即调用该方法__init__
    我猜测由于使用了相同的实例名称('swaroop' 和'kaleem'),它正在释放原始实例并对其进行垃圾收集。但是,这似乎对当前的人口数量造成了严重破坏。

    这里发生了什么?
    避免这种混乱的好方法是什么?
    避免使用__del__? 在重用它们之前检查现有的实例名称?...

    谢谢,埃里克

    0 投票
    1 回答
    1248 浏览

    boost - 增强信号 - 如何控制发送给订阅者的对象的生命周期?智能指针?

    我在 Red Hat Enterprise Linux 5.3 下使用 boost::signals2。

    我的信号创建了一个对象副本并将其指针发送给订阅者。这是为了线程安全而实现的,以防止工作线程在读取对象的同时更新对象上的字符串属性(也许我应该重新考虑使用锁?)。

    无论如何,我担心的是多个订阅者在他们自己的线程上取消引用指向复制对象的指针。如何控制对象的生命周期?我如何知道所有订阅者都已使用该对象并且可以安全地删除该对象?

    提前感谢任何提示或方向,

    -埃德

    0 投票
    5 回答
    995 浏览

    c# - 辛格尔顿工厂,有点像

    对不起,如果这已经在其他地方得到了回答……我发现了很多关于类似事情的帖子,但不一样。

    我想确保一次只存在一个对象的一个​​实例,但我不希望该对象在其自然生命周期之后保留,因为它可能是单例模式。

    我正在编写一些代码,其中每分钟都会触发列表处理(由我无法控制的外部代码)。目前,我每次只创建一个新的“处理”对象,当它超出范围时,它会按照正常情况被销毁。但是,有时处理时间可能超过一分钟,因此下一个触发器将在新线程中创建处理类的第二个实例。

    现在,我想要一种机制,一次只能存在一个实例……比如说,某种工厂一次只允许一个对象。例如,对工厂的第二次调用将返回 null,而不是一个新对象。

    到目前为止,我的(蹩脚的)解决方案是将工厂类型对象作为处理器类的嵌套类:

    我正在考虑为 XmlJobListProcessor 类编写一个显式析构函数,将“instanceExists”字段重置为 false。

    我意识到这是一个非常糟糕的设计。工厂本身应该是一个类...它只是嵌套的,因此它和实例析构函数都可以访问 volatile 布尔值...

    有人有更好的方法来做到这一点吗?干杯