- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我在 VS2008 中构建以下 C++/CLI 代码时,显示代码分析警告 CA1001。
ref class A
{
public:
A() { m_hwnd = new HWND; }
~A() { this->!A(); }
protected:
!A() { delete m_hwnd; }
HWND* m_hwnd;
};
ref class B
{
public:
B() { m_a = gcnew A(); }
protected:
A^ m_a;
};
warning: CA1001 : Microsoft.Design : Implement IDisposable on 'B' because it creates members of the following IDisposable types: 'A'.
要解决此警告,我必须将此代码添加到类 B:
~B() { delete m_a; }
但是我不明白为什么。 A 类通过其析构函数(和终结器)实现 IDisposable。
因此,每当 A 被垃圾回收时,肯定会调用 A 的终结器或析构函数,从而释放其非托管资源。
为什么 B 必须添加一个析构函数来调用其 A 成员的“删除”?
如果 B 显式调用“delete m_a”,GC 是否只会调用 A 的析构函数?
编辑:如果您使用声明 A 成员的“语法糖”方法,这似乎会自动工作,如下所示:
ref class B
{
public:
B() { }
protected:
A m_a;
};
但这并不总是可能的。
为什么 GC 不够聪明,无法在没有其他指针指向它时自动处理 A^ 的托管引用指针?
最佳答案
您应该为成员使用堆栈语义,并向包含类添加析构函数。然后该成员将被处置。参见 http://msdn.microsoft.com/en-us/library/ms177197.aspx
ref class B
{
public:
B() {}
~B() {}
protected:
A m_a;
};
成员仍然是裁判。类型并且仍然在堆上创建。
编辑:
.net 中的 Dispose 充其量是不幸的,在 C# 中,整个确定性行为被破坏,您必须非常严格地调用 Dispose 才能获得大多数 c++ 开发人员期望的行为。
在 c++/cli 中,堆栈语义使其变得更好。如果您不能使用它们,您将不得不显式调用 dispose,这在 c++/cli 中由析构函数表示。
如果成员像 C# 一样是普通托管指针,则自动将处置调用链接到成员的唯一方法是通过堆栈语义,您必须手动链接调用。
许多类可能持有相同的 A^ 指针,没有办法知道哪个应该调用析构函数。
您收到警告是因为您已经实现了导致您的类实现 IDispose 的析构函数。这使您有机会以确定性方式进行清理。
单独的GC只能收集一个没有引用的对象并调用finalizer。这远非确定性的。请注意,依靠终结器进行清理应该只是一个安全网,因为它可能会在未来很长一段时间内被调用(如果有的话)。
我建议尝试设计您的代码以允许上述模式。
关于garbage-collection - 为什么 GC 不会自动处理我类(class)的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1265990/
是否有带有索引的.collect?我想做这样的事情: def myList = [ [position: 0, name: 'Bob'], [position: 0, name: 'J
我创建了一个 Collection 类,它扩展了 ArrayList 以添加一些有用的方法。它看起来像这样: public class Collection extends ArrayList {
我知道如果我有元素,我想得到 List/Set/Map 我可以调用这个元素: Collections.singleton()/Collections.singletonList()/Collectio
我刚刚在我的 pom 文件中看到 Apache commons-collections 有两个不同的组 ID: commons-collections commons-collect
我们可以对所有 Collections 类型的对象(如 Set 和 List)使用 Collections.synchronizedCollection(Collection c),这就是为什么我们有
我有List>我想让它把上一个集合中的所有人复制到List收藏。 我是这样做的: var People = new List>{ new List{...},... };
我想做的是使用良好的旧循环非常简单。 假设我有一个包含 B 列表的对象 A。 public class A { public List myListOfB; } 在其他一些方法中,我有一个 As
在 Capgemini 的采访中,我被问到一个我无法回答的问题。所有集合类和接口(interface)共有的那些方法是什么? 最佳答案 所有 java 对象类(包括所有集合)都派生自名为 Object
我有一系列存储估计信息的数据库表。当设置某些边界时,我试图从所有数据库表中返回所有数据。 收藏 $estimateItems = new Collection(); $esti
为什么 Haskell 实现如此专注于链表? 例如,我知道 Data.Sequence 效率更高 大多数列表操作(cons 操作除外),并且被大量使用; 但是,从语法上讲,它“几乎不受支持”。 Has
我试图简单地将我在 PHP 中请求的内容返回到 JSON。我的问题是每个库存尚未完成。事实上,它是“渲染”,但“this.collection.models”尚未完成,因为请求尚未完成。 我应该如何解
本质上,作为Powershell脚本的一部分,我需要实现广度优先搜索。因此,我需要队列,并且认为System.Collections.Queue与其他任何队列一样好。但是,当我从队列中取出一个对象时,
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是 on-topic用于堆栈溢出。 已关闭10 年前。 Improve t
嗨,我不明白为什么这不起作用? Notifications.update({'userId':Meteor.userId(), 'notifyUserId':notifyFriendId}, {$se
假设我有一个闭包: def increment = {value, step -> value + step } 现在我想遍历我的整数集合的每个项目,用 5 递增,并将新元素保存到一个新集合中:
使用逐页 View 时,我的 plone 集合文件夹未显示所有项目。基本上我有 9 页包含元素,但第 6 - 8 页显示的内容完全相同。因此,并非所有项目都会显示,即使项目总数对应于应该在集合中的元素
private Map> map ,其中 ProgramCourse 是我的项目中的域类,上面的 map 是我运行项目时域类 Program 的字段以下异常即将到来。 Use of @OneToMan
三者的主要区别是什么?现在,我想分别使用字符串/字符串创建一个键/值对。这三个似乎都有我可以使用的选项。 编辑:我只想创建一个简单的哈希表 - 没什么特别复杂的。 最佳答案 通用集合几乎完全取代了基础
我正在为 NodeJs 使用 mongodb 驱动程序,其中有 3 个方法: 1) db.collection.insert 2) 数据库.collection.insertOne 3) db.col
我有一个集合,我正在尝试使用 Distinct 方法删除重复项。 public static Collection imagePlaylist imagePlaylist = imagePlaylis
我是一名优秀的程序员,十分优秀!