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

c++ - 提升 shared_from_this 和析构函数

我发现不允许在类的析构函数中调用shared_from_this:

https://svn.boost.org/trac/boost/ticket/147

此行为是设计使然。由于析构函数将销毁对象,因此为它创建 shared_ptr 是不安全的,因为一旦析构函数结束,它将变得悬空。

我理解这个论点,但是如果我需要一个“shared_from_this”指针来清理引用(而不是共享所有权)怎么办。

这是我不使用 shared_ptr 的示例:

在这里,我尝试将其转换为共享指针。但是我找不到完成析构函数的好方法:

如何实现上面示例中的析构函数?

0 投票
4 回答
2439 浏览

c++ - 在调用析构函数之前对象的生命周期已经结束?

我不明白这一点:

3.8/1 “T 类型对象的生命周期在以下情况下结束: — 如果 T 是具有非平凡析构函数 (12.4) 的类类型,则析构函数调用开始,或者 — 对象占用的存储空间被重用或释放。 "

如果生命周期在析构函数开始之前结束,这是否意味着访问析构函数中的成员是未定义的行为?

我也看到了这句话:

12.7 “对于具有非平凡析构函数的对象,在析构函数完成执行后引用对象的任何非静态成员或基类会导致未定义的行为。”

但它并不清楚在析构函数期间允许什么。

0 投票
5 回答
4067 浏览

c++ - 需要删除静态向量吗?

我一直在学习 c++,但我对向量感到有些困惑。具体来说,如果静态向量在内部实现了一个动态数组,那么当程序结束时,该动态数组正在使用的堆栈内存是否会被释放,或者我应该使用删除操作还是在静态向量上调用析构函数?

0 投票
2 回答
417 浏览

c# - SL 自定义控件:当注销事件时防止内存泄漏?

我正在创建一些自定义 wp7 silverlight 自定义控件,这些控件在 OnApplyTemplate() 中的模板子项上注册一些事件。

我想我必须取消注册这些以防止内存泄漏。但当?我会尝试 unloaded 事件 - 这有效,但我有这个问题。场景:在 Page1 我有我的自定义控件。然后从 Page1 导航到 Page2 调用我的自定义控件的 Unloaded 事件。到目前为止,一切都很好。但是后来我导航回我的自定义控件的事件没有再次注册,所以使用该控件没有任何反应。

那么我是否应该正确注册和注销事件以确保一切都按预期工作并且我不能创建内存泄漏?

谢谢你的帮助!

编辑:

这是我的 OnApplyTemplate() 方法的示例:

0 投票
8 回答
37805 浏览

c++ - 从基类构造函数调用纯虚函数

我有一个包含纯虚函数的基类 MyBase:

void PrintStartMessage() = 0

我希望每个派生类在它们的构造函数中调用它

然后我把它放在基类(MyBase)构造函数中

但我得到一个链接器错误。

我想强制所有派生类...

我必须怎么做?

0 投票
4 回答
7584 浏览

.net - MEF 保留对 NonShared IDisposable 部分的引用,不允许它们被 GC 收集

我在 MEF 的部分生命周期中遇到了一些问题,这会导致我的 Prism 应用程序中的内存泄漏。

我的应用程序导出视图和视图模型并PartCreationPolicy设置为CreationPolicy.NonShared. 视图和视图模型分别继承自ViewBaseViewModelBase,它们实现了IDisposable.

现在,由于我的部件实现IDisposable了,对它们的引用由容器保存,这导致它们不会被垃圾收集器释放。根据零件寿命的 MEF 文档,这是设计使然:

除非满足以下条件之一,否则容器不会保存对其创建的部件的引用:

  • 该部分标记为Shared
  • 该部分实现IDisposable
  • 一个或多个导入配置为允许重组

那么我怎样才能让 MEF 不保留对这些部分的引用呢?是否有一个属性可以让 MEF 知道我不希望它保留对我的部分的引用,即使它实现了IDisposable

上述文章中讨论的两种策略对我来说似乎都不是好的解决方案:

  • ReleaseExport需要一个Export对象作为参数,我不知道如何提供。我有我的视图实例,但我无法知道用于创建视图的合同是什么。如果有一个ReleaseExport可以接收容器创建的任何对象的重载,那就太好了。
  • 使用子容器似乎也不是一个自然的选择。

任何帮助将不胜感激。

0 投票
2 回答
2399 浏览

asp.net - ASP .NET 应用程序生命周期 + 单例实例生命周期

请考虑以下情况:

  1. 我使用 ASP .NET MVC 3 框架创建了一个完整的 Web 应用程序。现在我的应用程序由 Web 服务器管理。
  2. 在我的应用程序的服务器端收到一个 HTTP 请求。
  3. 实现单例设计模式的类在服务器端实例化。
  4. 向浏览器发送响应。
  5. 在我的应用程序的服务器端收到另一个 HTTP 请求。步骤 2 中使用的单例实例在服务器端是否仍然可用?

我在此页面上阅读了有关 ASP .NET 应用程序生命周期的一些信息:http: //msdn.microsoft.com/en-us/library/ms178473.aspx

但我仍然无法回答我的问题。

提前感谢您未来的帮助


我刚刚在VS2010下做了一些测试。

这是我的项目的主要组件列表:

  • 包含 Index HttpGet 操作方法的 Home 控制器。
  • 由 Index 操作方法产生的视图。
  • 实现单例设计模式的 SingletonTest 类。

这是 SingletonTest 类的代码:

这是 Index 操作方法的代码:

这是视图的代码:

这是我遵循的测试场景:

  1. IIS服务器已经被VS2010自动启动了。
  2. 我已请求 /Home/Index/ URL,然后显示值 1。
  3. 我已请求 /Home/Index/ URL,然后显示值 2。
  4. ...

该测试表明,在处理下一个请求时,在步骤 1 中创建的 SingletonTest 实例可用。我想在服务器上为我的 Web 应用程序分配了一个内存空间。

然后我停止了 IIS 服务器,并再次遵循了我的测试场景。我得到了和以前一样的结果:1、2、....

0 投票
1 回答
216 浏览

repository - 使用 Unity 在两个存储库之间共享 UnitOfWork 的最佳方法是什么?

除了 UnitOfWork 和 Repository 模式之外,我还想将 Unity 用作 IoC。我阅读了各种相关的文章和问题,但没有一个让我完全满意。我对所有方法都有问题。一个例子可以更好地解释我的问题:

我们希望在两个不同的类(可能是业务服务)中使用两个存储库,但整体工作在一个单元中。

起点是 LocalService1.Method1 方法。

主要问题是“如何在调用 LocalService1.Method1 时在 IRepository1 和 IRepsitory2 之间共享 UnitOfWork(这里可以是 ObjectContext)?”。更重要的是“我想确定 UnitOfWork 的处置”。

我想答案将集中在这些问题上:

  • IOC 配置
  • 生命周期配置
  • 处置时间(如何以及何时?)

如果您推荐使用“HttpContext”,请考虑非 Web 环境。

我知道我的问题几乎是关于“生命时间管理”的,但我正在寻找一种详尽的方法。

0 投票
1 回答
189 浏览

c# - 避免重复分配没有变量/成员的 Action 对象

通常我需要在非常频繁运行的代码中最小化对象分配。
当然我可以使用像对象池这样的普通技术,但有时我只想要本地包含的东西。
为了尝试实现这一目标,我提出了以下建议:

目前,用法是:

我想改进的是,整个东西不包含在一个地方(.SetResetAction它与实际使用的地方是分开的)。

我想让代码如下所示:

这个问题是我得到一个对象分配(它创建一个Action<T>)每个循环。

是否有可能在没有任何对象分配的情况下获得我想要的用法?

显然我可以创建一个ReuseableList<T>内置的,Action但我想允许其他情况下操作可能会有所不同。

0 投票
0 回答
136 浏览

c++ - 是否可以通过这种方式销毁和重新创建对象?

可能重复:
我能否在 C++ 中重新开始而不会再次失败?

考虑T* o = new(T()),其中 T 定义了一个复制构造函数。还假设表达式new使用默认值::operator new()

为了重新使用分配给 o 的内存,而不是用 删除对象delete o,标准是否允许以下​​顺序: 

  1. o->~T()显式调用
  2. 使用placement new 在先前为o 分配的内存上创建对象的副本:new(o) T(x)
  3. 完成 o 及其内存后,使用delete o

我也问这个,因为我不明白为什么std::map<T, V>(或其operator[]具体),例如,如果上面的序列可以在没有这个要求的情况下工作,那么需要 T 定义一个适当的赋值运算符。我怀疑 map 是这样设计operator=()的,只是因为复制构造函数可以具有不同的语义,因为大多数时候它们只是以相同的方式实现。