- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
您认为这样的问题在面试中最好的答案是什么?
我想在这里找不到此副本,如果有副本,请链接它。
最佳答案
另一种看待这种情况的方法-而不是仅仅引用说明结构不能/没有析构函数的规范-考虑如果规范被更改以使它们发生了,会发生什么?或者,让我们问一个问题:可以我们猜想语言设计者为什么决定首先不允许结构具有“析构函数”?
(这里不要挂断词“析构函数”;我们基本上是在讨论结构上的魔术方法,当变量超出范围时会自动调用该方法。换句话说,一种类似于C++析构函数的语言功能。 )
首先要意识到的是,我们不关心释放内存。无论对象是在堆栈上还是在堆上(例如,类中的结构),迟早都会以一种或另一种方式来处理内存。从堆栈中弹出或被收集。首先拥有像析构函数之类的东西的真正原因是为了管理外部资源-文件句柄,窗口句柄之类的东西,或者其他需要特殊处理以清除CLR本身不知道的东西。
现在假设您允许一个结构具有一个可以执行此清除操作的析构函数。美好的。直到您意识到将结构作为参数传递时,它们都按值传递:将它们复制。现在,您有两个具有相同内部字段的结构,它们都将尝试清理同一对象。一个将首先发生,因此之后使用另一个的代码将开始神秘地失败...然后其自身的清理将失败(希望如此!-最坏的情况是它可能成功清理了一些其他随机资源-这可以例如,在重复使用句柄值的情况下发生。)
可以想象,可以对作为参数的结构进行特殊处理,以使它们的“析构函数”不运行(但是要小心-现在,您需要记住,在调用函数时,始终是外部拥有“实际”资源的函数) -所以现在有些结构与其他结构有些微不同...)-但是,您仍然会遇到常规结构变量的问题,可以将其中一个分配给另一个,以进行复制。
您可能可以通过在分配操作中添加一种特殊的机制来解决此问题,该机制以某种方式允许新结构与其新副本协商基础资源的所有权-也许它们共享该资源或将所有权从旧所有权直接转移到新资源-但现在您从本质上说,您已经进入C++ Realm ,在这里您需要复制构造函数,赋值运算符,并添加了许多微妙之处,以等待不了解新手的程序员。并且请记住,C#的重点是尽可能避免这种C++样式的复杂性。
而且,正如让其他答案之一指出的那样,为了使事情更加困惑,结构不仅仅作为局部对象存在。对于本地人来说,范围很好并且定义明确;但是结构也可以是类对象的成员。在这种情况下,何时应该调用“析构函数”?当然,您可以在容器类完成后执行此操作;但是现在您有了一种机制,该机制的行为取决于结构体的位置:如果结构体是本地结构,则它会在作用域结束时立即触发;如果该结构在一个类中,则它会被延迟触发...因此,如果您真的关心确保某个结构中的某些资源在特定时间被清除,并且您的结构最终可以作为a的成员而结束在类中,无论如何,您可能都需要显式的名称,例如IDisposable/using(),以确保您了解基础知识。
因此,虽然我不能声称要为语言设计师说话,但我可以做出一个很好的猜测,他们决定不包括这种功能的一个原因是因为它将是一 jar 蠕虫,并且他们希望保持C#相当简单。 。
关于c# - 为什么结构不能有析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8276036/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!