首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在.net析构函数中重新创建对"this"的有根引用是否合法?

在.NET析构函数中重新创建对"this"的有根引用是否合法?

这个问题涉及到.NET中的垃圾回收机制和引用的概念。在.NET中,垃圾回收器会自动追踪和回收不再使用的对象。当一个对象没有任何引用指向它时,它将被视为不再使用,并在下一次垃圾回收时被回收。

在析构函数中,对象的生命周期即将结束,因此不应该创建对"this"的有根引用。如果在析构函数中创建对"this"的有根引用,可能会导致对象无法被正确回收,从而导致内存泄漏。

因此,在.NET析构函数中重新创建对"this"的有根引用是不合法的。如果需要在析构函数中处理某些资源,应该使用其他方法,例如实现IDisposable接口,并在Dispose方法中释放资源。

总结:在.NET析构函数中重新创建对"this"的有根引用是不合法的,可能会导致内存泄漏。应该使用其他方法来处理析构函数中的资源。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C#之垃圾回收机制

首先说bai下C#变量类型吧,duC#中有2个变量类zhi型,一种是值类型,一dao种是引用类型,值类型是zhuan栈上创建shu,这一类型用不到GC,引用类型是创建,GC主要是在这里管理对象...大致上来讲.NET应用运行期间,2代、1代和0代GC频率应当大致为1:10:100。 该如何释放非托管资源呢? 既然了垃圾收集器,为什么还要Dispose方法和函数?...你无法预测函数何时会被调用,所以尽量不要在这里操作可能被回收托管资源,函数只用来释放非托管资源。...GC释放包含函数对象,需要垃圾处理器调用俩次,CLR会先让函数执行,再收集它占用内存。...GC通过从程序对象开始遍历来检测一个对象是否可被其他对象访问,而不是用类似于COM引用计数方法。 GC一个独立线程运行来删除不再被引用内存。 GC每次运行时会压缩托管堆。

1K20

C# 内存管理机制及 WP 内存泄漏定位方法

函数(C#叫做Finalizer) GC过程,遇到函数对象,会怎么处理?因为函数复杂度是未知可能非常耗时,所以GC过程调用函数是不明智。...于是遇到函数对象,把这些对象放到一个待队列。会有一个低优先级线程去执行这些对象函数。...为了兼容程序员函数里激活对象,比如在函数里把this赋值给一个静态变量导致对象又变成可到达了,GC执行完函数之后再决定是否要从内存里删除这个对象。...引用类型通过new关键字创建,对象都是存储堆里,值类型则不一样,值类型对象函数声明时,即使是通过new关键字创建,也是栈中分配。...其他被引用导致泄漏,一般可以泄漏搜索this指针,看this指针是否被添加到一些静态变量。 6. 小结 查找内存泄漏步骤分为三部: a. 发现泄漏(存活对象计数) b.

4.2K80
  • .NET面试题解析(06)-GC与内存管理

    解释一下C#里函数?为什么有些编程建议里不推荐使用函数呢? 9. Finalize() 和 Dispose() 之间区别? 10. Dispose和Finalize方法何时被调用?...11. .NET托管堆是否可能出现内存泄露现象? 12. 托管堆上创建新对象哪几种常见方式?  ...无法被子类显示重写:.NET提供类似C++函数形式来实现重写,因此也有称之为函数,但其实她只是外表和C++里函数像而已。...当CLR托管堆上分配对象时,GC检查该对象是否实现了自定义Finalize方法(函数)。如果是,对象会被标记为可终结,同时这个对象指针被保存在名为终结队列内部队列。...托管堆上创建新对象哪几种常见方式?

    56810

    .NET面试题解析(06)-GC与内存管理

    解释一下C#里函数?为什么有些编程建议里不推荐使用函数呢? 9. Finalize() 和 Dispose() 之间区别? 10. Dispose和Finalize方法何时被调用?...11. .NET托管堆是否可能出现内存泄露现象? 12. 托管堆上创建新对象哪几种常见方式?  ...无法被子类显示重写:.NET提供类似C++函数形式来实现重写,因此也有称之为函数,但其实她只是外表和C++里函数像而已。...当CLR托管堆上分配对象时,GC检查该对象是否实现了自定义Finalize方法(函数)。如果是,对象会被标记为可终结,同时这个对象指针被保存在名为终结队列内部队列。...C#里函数其实就是终结器Finalize,因为长得像C++里函数而已。

    64020

    .Net面试八股文问题答案分享

    这里作者通过多年研究CLR/JIT源码得出结论(如有疏漏,可不吝指正),给予参考: 1 .Net GC回收步骤 答案:标记,计划,重定位,压缩,清扫 2 .跨代对象引用是什么 答案:不同代之间对象引用...,比如二代对象引用了短暂堆对象 3 .字符串存储在哪个堆 答案:.Net7GC堆,.Net8GC堆外 4 .对象是什么,以及如何释放它 答案:局部引用变量,一般编译器释放。...5 .固定对象含义 答案:非托管对象句柄,GC堆不会被GC移动 6 .解释下,强引用句柄,弱引用句柄 答案:强引用句柄指示对象不可回收,弱引用句柄对象可以被回收 7 .函数是如何运行 答案...:通过内核对象进行通知调用函数线程,取出列表堆(FinalizerListSeg)或者是关键列表堆里面包含函数对象,运行函数。...保存根对象,GC时候取出对象递归标记 11.GC如何重新决定目标代 答案:阈值用完或者需要低延迟时候 12.执行GC线程几种 答案:三种,后台线程,工作站线程,服务器线程 13.GC总体流程

    33730

    .Net面试八股文问题答案分享

    这里作者通过多年研究CLR/JIT源码得出结论(如有疏漏,可不吝指正),给予参考: 1 .Net GC回收步骤 答案:标记,计划,重定位,压缩,清扫 2 .跨代对象引用是什么 答案:不同代之间对象引用...,比如二代对象引用了短暂堆对象 3 .字符串存储在哪个堆 答案:.Net7GC堆,.Net8GC堆外 4 .对象是什么,以及如何释放它 答案:局部引用变量,一般编译器释放。...5 .固定对象含义 答案:非托管对象句柄,GC堆不会被GC移动 6 .解释下,强引用句柄,弱引用句柄 答案:强引用句柄指示对象不可回收,弱引用句柄对象可以被回收 7 .函数是如何运行 答案...:通过内核对象进行通知调用函数线程,取出列表堆(FinalizerListSeg)或者是关键列表堆里面包含函数对象,运行函数。...保存根对象,GC时候取出对象递归标记 11.GC如何重新决定目标代 答案:阈值用完或者需要低延迟时候 12.执行GC线程几种 答案:三种,后台线程,工作站线程,服务器线程 13.GC总体流程

    37130

    《C++Primer》第十五章 面向对象程序设计

    派生类可以继承基类成员,但是对于net_price这种与类型相关操作必须重新定义,即派生类需要对这些操作提供自己新定义以覆盖override从基类继承而来旧定义 C++,基类必须把两种成员函数区分开...如果找遍了该类及其基类都没找到,则编译器报错 一旦找到了mem,就进行常规类型检查,以确定本地调用是否合法 假设调用合法,则编译器根据调用是否是虚函数产生不同代码: 如果mem是虚函数且我们是通过指针或者引用进行调用...using可以改变个别成员可访问性,这样基类函数每个实例派生类中都必须是可访问派生类没有重新定义重载版本访问实际上是using声明点访问。 构造函数与拷贝控制 1....虚函数 继承关系基类拷贝控制最直接影响是基类通常应该定义一个虚函数,这样我们就可以动态分配继承体系对象了。...构造函数函数调用虚函数 派生类对象基类部分首先被构造,然后再构造派生类部分。对象销毁顺序正好相反,派生类函数首先执行,然后是基类函数

    1.2K20

    .NET GC 精要(三)

    函数 或者 Finalize 函数 即可(定义 函数 或者 Finalize 函数会在对象"被清理"之后执行),示例代码如下: // method 1 class TestClass1 {...终结"函数(函数 或者 Finalize 函数)呢?...你可能会认为答案非常简单:在对象被清理时候调用执行即可.这种方式的确是可行,但是会降低 GC 性能:自定义"终结"函数,代码可能会执行数据库关闭等耗时操作,如果我们 GC 流程中直接同步调用这些...首先,如果一个对象定义了"终结"函数,那么创建该对象时,该对象引用会被额外添加到 Finalization Queue ,之后如果 GC 流程发现该对象已经没有被引用,正常情况下该对象就会被清理,...但是由于 Finalization Queue 还存在(该对象)引用关系,该对象不仅不会被清理,反而可能会进行"代提升"(譬如从 Gen 1 提升到 Gen 2,更多细节可以看之前讲述),另外

    35300

    CC++面试常问题集(2)

    因此,创建子类对象时,为了初始化从父类继承来数据成员,系统需要调用其父类构造方法。 二,函数  函数也不会被子类继承,只是子类函数中会调用父类函数。...C++基类采用virtual虚函数是为了防止内存泄漏 具体地说,如果派生类申请了内存空间,并在其函数这些内存空间进行释放。...核心理念就是通过基类访问派生类定义函数。它提供了一种接口界面。允许派生类基类函数重新定义。由多态方式调用时候动态绑定。...,程序员无法直接它进行存取),被引用对象直接用r表示 (4)可以const指针,但是没有const引用; (5)指针可以多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法...是C++运算符; 对于非内部数据类型对象(自己声明类对象)而言,光用maloc/free无法满足动态对象要求,对象创建同时要自动执行构造函数,对象消亡之前要自动执行函数,由于malloc

    1.2K10

    轻松搞定面试“虚”

    包括:虚函数,纯虚函数,虚基类,虚继承... 1.什么是虚函数什么作用? 基类用virtual声明成员函数为虚函数。这样就可以派生类重新定义此函数,为它赋予新功能,并能方便地被调用。...虚函数作用是允许派生类重新定义与基类同名函数,并且可以通过基类指针或引用来访问基类和派生类同名函数,达到多态目的。 2.什么是纯虚函数,什么是纯虚类,什么作用?...是否每个类函数都要设置成virtual?是否可以将函数设置成内联函数。 这样做是为了当用一个基类指针删除一个派生类对象时,派生类函数会被调用。...(动态绑定是根据对象动态类型而不是函数名,调用构造函数之前,这个对象根本就不存在,它怎么动态绑定?) 6.是否可以函数或者构造函数调用虚函数构造函数不要调用虚函数。...时候会首先调用子类函数掉对象子类部分,然后调用基类函数基类部分,如果在基类函数里面调用虚函数,会导致其调用已经子类对象里面的函数,这是非常危险

    67620

    《Rust for Rustaceans》 样章试译 | 第二章 Rust 基础

    当一个值所有者不再使用它时,所有者责任通过(Drop)它来该值进行任何必要清理。 Rust ,当保存值变量不在作用域内时,会自动。...一个变量持有另一个值引用,并不表示拥有那个值,因此当这个变量被时候,它引用另一个值并不会同时。 清单 2-3 代码快速总结了有关所有权、移动和复制语义以及规则。...引用是一个指针,它携带了自身该如何被使用附加契约,例如,引用是否提供引用独占访问,或者被引用是否也可以其他引用指向它。 共享引用 一个共享引用,&T,顾名思义是一个可以共享指针。...当稍后重新指派 z时,会创建一个仅在此处存在全新变量。考虑到这个模型,这个例子并不奇怪。 泛型生存期 偶尔你需要在自己类型存储引用。...基本上,当你类型实例被时,借用检查器会检查在它之前使用你类型任何泛型生存期是否仍然合法。这是必要,以防止代码确实使用了这些引用

    5.8K31

    java — 垃圾回收

    因为JAVA并没有提够像“函数或者类似概念函数,要做一些类似清理工作时候,必须自己动手创建一个执行清理工作普通方法,也就是override Object这个类finalize()方法...普通清除工作,为清除一个对象,那个对象用户必须在希望进行清除地点调用一个清除方法。这与C++"函数"概念稍有抵触。C++,所有对象都会破坏(清除)。...若对象是用new创建(类似于Java),那么当程序员调用C++ delete命令时(Java没有这个命令),就会调用相应函数。...然而,随着以后学习深入,就会知道垃圾收集器存在并不能完全消除函数需要,或者说不能消除函数代表那种机制需要(原因见下一段。...若希望执行除释放存储空间之外其他某种形式清除工作,仍然必须调用Java一个方法。它等价于C++函数,只是没后者方便。

    1.3K100

    读完某C++神作,我只记下了100句话

    容器类型不同或元素类型不同,但是兼容可以用assign函数来赋值。 vector容器元素以连续方式存放【动态数组】。预先分配策略,需要重新分配时加倍当前容量。...即使定义了其他构造函数,也会合成复制构造函数【能够复制类数组】。类成员指针一般需要显示定义复制构造函数。 声明而不定义成员函数合法,但是使用将导致链接失败。...合成函数并不删除指针成员指向对象。即使编写了自己函数,合成函数仍然运行。 默认构造函数不全,会调成员默认构造函数,复制构造函数不全就不行了。 使用计数是管理智能指针类通用技术。...类一般要定义虚函数。 派生类只能通过派生类对象访问protected成员,不能用基类对象访问。基类定义为virtual就一直为虚函数,派生类写不写virtual都是虚函数。...派生类指针静态类型和动态类型不一致时【基类指针指向派生类是时】,为保证删除指针调用合适函数【多态】,基类必须为virtual。

    1.4K20

    C++ 核心编程

    C++函数形参列表形参是可以默认值。...如果加载时上面的void func(int& a)方法,是不合法引用必须有一个合法内存空间,而这里10是常量区里面。...~类名(){} 函数,没有返回值也不写void 函数名称与类名相同,名称前加上符号 ~ 函数不可以参数,因此不可以发生重载 程序在对象销毁前会自动调用,无须手动调用,而且只会调用一次...而一旦用户定义,则对象销毁时自动调用。 不同点:虽然他俩都为公开类型。构造可以重载,多个兄弟,而却不能重载,但它可以是虚函数,一个类只能有一个函数。...多态使用时,如果子类中有属性开辟到堆区,那么父类指针释放时无法调用到子类代码 解决方式:将父类函数改为虚或者纯虚和纯虚共性: 可以解决父类指针释放子类对象 都需要有具体函数实现

    2.1K20

    【C++】侯捷C++面向对象高级编程(上)

    ,不带指针类,大多不用写函数。...(全局函数同理) double real()const{ return re;} 该加const位置一定要加const——创建类对象前面加了const 参数传递 首先考虑传引用,注意看是否可以传引用...(如图) 但是,将两个已有的数据加在一起,不能放到原来已经有的位置上,这时候就需要在函数创建一个新变量用来接收这个新得到值,这时候不能返回这个新创建变量,因为局部变量( local变量)函数结束之后就消失了...是从哪里创建呢? 这里个特殊语法: typename();——创建临时对象,它生命到下一行就结束了。...,那么他构造函数函数调用顺序是如何呢?

    43310

    小心点,别被当成垃圾回收了。

    初识引用 对于刚接触 Java C++ 程序员而言,理解栈和堆关系可能很不习惯。 C++ ,可以使用 new 操作符堆上创建对象,或者使用自动分配在栈上创建对象。...这么做可以防止堆碎片化,防止大对象由于堆空间不连续性而无法分配情况。 ? 所以上面的过程中就涉及到一个节点(GC Roots) 来判断是否存在需要回收对象。...Finalizers C++ 允许对象定义函数方法:当对象超出作用范围或被明确删除时,会调用函数来清理使用资源。...对于大多数对象来说,函数能够释放使用 new 或者 malloc 函数分配内存。Java,垃圾收集器会为你自动清除对象,分配内存,因此不需要显式函数即可执行此操作。...时,可以选择是否需要关联引用队列。JVM 会在特定时机将引用入队到队列,程序可以通过判断引用队列是否已经加入引用,来了解被引用对象是否被GC回收。

    71310

    【C++】类和对象()

    这就引出了我们函数 函数:与构造函数功能相反,函数不是完成对象销毁,局部对象销毁工作是由编译器完成。而对象销毁时会自动调用函数,完成类一些资源清理工作....函数是特殊成员函数。 其特征如下: 函数名是类名前加上字符 ~。 无参数无返回值。 一个类且只有一个函数。若未显式定义,系统会自动生成默认函数。...对象生命周期结束时,C++编译系统系统自动调用函数了构造函数函数之后,就可以自动调用初始化和销毁了(不会导致自己忘记初始化和销毁了),这实际上也大大方便了我们。...创建对象时,可否创建一个与一个对象一模一样新对象呢 ❓只要思想不滑坡,办法总比困难多,此时我们拷贝构造函数也来了 拷贝构造函数:只有单个形参,该形参是对本类类型对象引用(一般常用const修饰...,实际修饰该成员函数隐含this指针,表明该成员函数不能对类任何成员进行修改。

    1.2K30

    C# IDispose

    释放过程 C#,当使用 IDisposable 接口释放对象时,以下步骤: 创建对象:当你创建一个实现 IDisposable 对象时,它引用存在于托管堆。...如果这个对象函数(finalizer),它也会被.NET运行时环境添加到队列。...这意味着该对象会从队列移除。 对象成为垃圾:当没有任何引用指向该对象时,该对象将变成垃圾。即使是调用 Dispose() 后,只要仍然对对象有效引用,垃圾收集器就无法回收它。....NET,垃圾收集器负责回收不再使用内存。垃圾收集器会自动调用对象函数(如果定义了的话),以清理非托管资源。然而,已经手动释放了非托管资源情况下,再次调用函数就没有必要了。...当创建一个包含终结器(即函数对象时,这个对象引用会被放到队列。垃圾收集器进行垃圾回收时,会检查这个队列,找出那些不再被应用程序代码引用对象。

    20320

    常见c和cpp面试题目汇总(一)

    引用只是一个别名,还是变量本身,引用任何操作就是变量本身进行操作,以达到修改变量目的 2、引用只有一级,而指针可以多级 3、指针传参时候,还是值传递,指针本身值不可以修改,需要通过解引用才能对指向对象进行操作...而函数一般写成虚函数原因 ? 1、构造函数不能声明为虚函数 1)因为创建一个对象时需要确定对象类型,而虚函数是在运行时确定其类型。...,还没有内存空间,更没有虚函数表地址用来调用虚函数即构造函数了 2、函数最好声明为虚函数 首先函数可以为虚函数,当一个指向派生类基类指针时,最好将基类函数声明为虚函数,否则可以存在内存泄露问题...如果函数不被声明成虚函数,则编译器实施静态绑定,删除指向派生类基类指针时,只会调用基类函数而不调用派生类函数,这样就会造成派生类对象不完全。...函数一旦结束,形参生命也宣告终结,做出修改一样没任何变量产生影响。 用引用作为返回值最大好处就是在内存不产生被返回值副本。 但是以下限制: 1)不能返回局部变量引用

    1.4K31

    《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

    所以C++标准定为全局或静态对象是首次用到时才会进行构造,并通过atexit()来管理。程序结束,按照构造顺序反方向进行逐个。所以C++是可以使用变量静态局部变量进行初始化。...2) 函数顺序 ① 调用派生类函数; ② 调用成员类对象函数; ③ 调用基类函数。 79、虚函数作用,父类函数是否要设置为虚函数?...2) 用auto_ptr对象来取代指针类成员,便构造函数做了强化,免除了抛出异常时发生资源泄漏危机,不再需要在函数手动释放资源; 3) 如果控制权基于异常因素离开函数,而此时正另一个异常处于作用状态...避免方法就是将第一个指针(比如a->value)置为NULL,这样调用函数时候,由于判断是否为NULL语句,所以a时候并不会回收a->value指向空间; 3) 移动构造函数参数和拷贝构造函数不同...每次创建新对象时,初始化指针并将引用计数置为1;当对象作为另一副本而创建时,拷贝构造函数拷贝指针并增加与之相应引用计数;一个对象进行赋值时,赋值操作符减少左操作数所指对象引用计数(如果引用计数为减至

    2.3K40
    领券