问题标签 [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 投票
2 回答
1248 浏览

delphi - Delphi 中安全的方式来分配与其生命周期相关的接口对象?

我有一个 Delphi 表单,它提供接口对象背后的功能,代码的其他部分也通过属于表单的属性获取引用。我不能将接口功能委托给子对象,因为表单上的控件/组件提供了太多的功能。我不能使用 TAggregatedObject 或 TContainedObject 将被传递的接口对象的生命周期链接到 Form,因为 TForm 类不继承自 TinterfacedObject 并且 Delphi 不支持多重继承,所以我不能将 TInterfacedObject 混合到继承链中. 如果表单被破坏,而其他一些代码持有表单传递的接口引用之一,这种情况可能会导致访问冲突。谁能想到一个很好的解决这个问题的方法?

0 投票
2 回答
1314 浏览

c++ - c++ 依赖注入:对象生命周期?

我来自 C#,并试图将我的一些实践翻译成 C++。我使用原始指针在整个代码中的各个地方使用了依赖注入。然后我决定用 std::shared_ptr 替换原始指针。作为该过程的一部分,建议我考虑使用堆栈分配的自动变量而不是动态分配它们(尽管该问题是在 unique_ptr 的上下文中,但可能有所不同)。

我相信下面的例子展示了自动变量的使用。

在上面的例子中,当 customAppservice 和 myclass 超出范围时,我怎么知道哪个会先被销毁?如果 customAppService 首先被销毁,则 MyClass 析构函数将失败。这是在这种情况下使用 shared_ptr 的一个很好的理由,还是有一个干净的方法来解决这个问题?

更新

ApplicationService 是一个类,它是与我的代码使用的第 3 方库交互所需的全局函数的包装器。我有这门课,因为我相信这是支持单元测试和独立功能的存根/模拟的标准方法。此类只是将调用委托给相应的全局函数。调用 appService_.Destroy(something); 实际上是在破坏 MyClass 的每个特定实例使用的对象,而不是破坏与 Application 类本身有关的任何事情。

0 投票
1 回答
3293 浏览

c++ - 与函数指针转换相关的 lambda 对象的生命周期

按照这个答案,我现在想知道 lambda 生命周期的规则是什么,以及它与自动转换创建的函数指针的生命周期有何关系。关于 lambda 的生命周期有几个问题(例如herehere),在这种情况下,答案是“它们的行为与您自己编写完整的仿函数对象完全一样”,但是两者都没有解决转换为函数指针的问题,这可能是一个非常明智的特例。

我整理了这个小例子来说明我的担忧:

这对这两种情况都有很好的定义吗?还是只为retFun1()?问题是:“函数指针指向的函数是否需要调用函子对象本身,或者在单独的函数中重新实现主体?” 任何一个都有意义,但是转换为函数指针特别需要一个无捕获的 lambda 的事实表明它实际上可能是后者。


换句话说 - 我可以看到编译器可能希望实现此类 lambda 的至少两种合理方式。一种可能的合法实现可能是编译器合成如下代码:

在这种情况下,thestatic和非static变体retFun都可以。但是,如果编译器实现 lambda 也是合法的,例如:

然后retFun2()是未定义的行为。

0 投票
2 回答
495 浏览

c++ - c++ 对象参数:多态性、值语义、对象生命周期?

当我从 C# 过渡到 C++ 时,我得到了很多建议,以尽可能使用值语义。几乎可以保证,如果我在任何地方发布带有指针的问题,就会有人出现并建议它应该是一个值。我开始看到曙光,我在代码中发现了很多地方,我可以用堆栈分配的变量(通常是引用)替换动态分配和指针。所以我认为我掌握了使用堆栈分配的对象并将它们作为引用传递给其他函数,当调用者中的对象生命周期比被调用者长时。

但是,当被调用者将获得所有权时,我有一个关于按值传递对象的问题。举个例子:

通常从灵活性和单元测试的角度来看,我希望 Animal 成为一个接口(C++ 中的抽象类),这样我就可以轻松地发送任意动物并使用模拟实现对其进行模拟。

在指针实现中,客户端代码会这样调用:

这里的客户端代码并不真正需要动物对象。它只是临时构建它以传递给方法。所以在这种情况下,没有共享语义。所以这似乎是价值语义的一个很好的例子。但是,我的理解是不能使用 Animal 作为值传递的参数,因为它是一个抽象类。

我的大多数不采用原始类型的成员函数都采用抽象类参数。那么处理这个问题的 C++ 方法是什么?(这就是你如何用值语义对 C++ 接口进行编程?)

0 投票
4 回答
279 浏览

c++ - 不是最重要的 const.. 但这是什么?

这个输出F~,但我期待~F

我将其构建为一个反例,以表明最重要的常量是一个例外而不是规则。它通常写成

当 const 引用绑定到临时对象时,该临时对象的生命周期会延长到引用的生命周期

我试图说明,虽然Foo()是临时的,_x但转换运算符返回的引用不是,并且上面的代码是不安全的。

但是输出似乎证明了该示例安全的,临时对象的生命周期Foo()因存在对其成员之一的 const 引用而延长。

这是正确的吗?这在标准中的什么地方有规定?

0 投票
2 回答
278 浏览

java - 为什么不立即收集“隐形”对象?

我刚刚读了这篇文章:关于垃圾收集的真相

“A.3.3 不可见”部分中,解释了对象如何以及何时进入invisible状态。

在下面的代码中,分配给变量的对象fooinvisible在离开try/catch块后变为并且将保持强引用,直到run方法退出(这永远不会发生,因为while循环永远运行)。

这篇文章中说:

但是,JVM 的有效实现不太可能在超出范围时将引用归零。

为什么没有效率?

我的解释尝试如下:

假设此方法的堆栈包含四个元素,现在不可见的对象位于底部。
如果要立即收集对象,则必须弹出并存储三个元素,弹出并丢弃第四个元素,然后将三个仍然有效的元素推回堆栈。
如果在控制流离开run方法后收集不可见对象,VM 可以简单地弹出所有四个元素并丢弃它们。

0 投票
1 回答
256 浏览

wcf - WCF 和容器生命周期

我确信这很明显,但我无法在 IIS 7.5 托管的 WCF 服务中找到关于容器生命周期的非常明确的答案。

如果容器存在于我的服务代码中,除非 InstanceContextMode 设置为单个,否则它将在每个请求上创建?(我知道坏主意)

如果我使用 ServiceHostFactory 和 IInstanceProvider 配置 WCF 以使用容器在每次调用时解析服务对象,那么 InstanceContextMode 将如何工作?它不取决于容器使用的生命周期策略吗?

如果它在工厂中创建的单例就足以使容器不会在每次调用时重新初始化?

谢谢

0 投票
1 回答
1479 浏览

c# - 每个 HttpContext 实例一个对象

我目前正在用 ASP.NET MVC 编写一个项目。我有一个仅适用于 DB 的 Web 项目和 DB 项目。这些层看起来像这样,它们只与兄弟层互操作。

DB 项目 (EF CF) - 发出 db 请求

Repository - 抽象底层数据库模型

服务- 所有业务逻辑都发生在这里。

ASP.NET MVC Web 应用程序- 前端演示

它们必须松散耦合,所以我使用 Unity DI/IoC 框架

我想要实现的是为DbContext每个 http 请求创建一个实例。以下是我目前实现的逻辑。

所做的是,如果Items当前的字典HttpContext没有,则在请求管道中DbContext添加一个。所有控制器都继承自它。我这样做的原因是,在执行期间将调用的所有存储库都应该DbContext对所有顺序数据库调用使用完全相同的对象。

  1. 有没有更好的方法将对象的生命周期与HttpContext?
  2. 是否可以使用 Unity(DI/IoC 框架)来做到这一点?
0 投票
3 回答
1900 浏览

c# - 匿名委托中捕获的私有字段

由于delegate捕获变量this._bar,它是否隐含地持有 的实例B?的实例是否B会通过事件处理程序引用并由 的实例捕获变量A

如果_barAttachToAEvent方法的局部变量会有所不同吗?

由于在我的情况下,一个实例的A寿命要长得多,而且比 的实例要小得多B,所以我担心这样做会导致“内存泄漏”。

0 投票
2 回答
4009 浏览

c# - 这个对象生命周期扩展闭包是 C# 编译器错误吗?

我正在回答一个关于闭包(合法地)延长对象生命周期的可能性的问题,当时我在 C# 编译器(4.0,如果这很重要)方面遇到了一些非常好奇的代码生成。

我能找到的最短的复制品如下:

  1. 创建一个在调用包含类型的静态方法时捕获本地的 lambda 。
  2. 将生成的委托引用分配给包含对象的实例字段。

结果:编译器创建一个引用创建 lambda 的对象的闭包对象,当它没有理由时 - 委托的“内部”目标是一个静态方法,而 lambda-creating-object 的实例成员不需要执行委托时被(并且不被)触摸。实际上,编译器的行为就像程序员this无缘无故地捕获了一样。

从发布版本生成的代码(反编译为“更简单”的 C#)如下所示:

观察 <>4__this闭包对象的字段填充了对象引用,但从不读取(没有理由)。

那么这里发生了什么?语言规范允许吗?这是一个编译器错误/奇怪,还是有充分的理由(我显然错过了)让闭包引用该对象?这让我很焦虑,因为这看起来像是喜欢关闭的程序员(比如我)在不经意间将奇怪的内存泄漏(想象一下,如果委托被用作事件处理程序)引入程序的秘诀。