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

当类型转换void指针指向对象时,析构函数不会被调用

当类型转换为 void 指针时,对象的析构函数不会被调用。这是因为 void 指针不包含任何类型信息,因此在释放内存时,编译器无法确定对象的确切类型,也就无法调用相应的析构函数。

为了确保对象的析构函数被正确调用,建议使用 C++ 的智能指针,如 std::shared_ptrstd::unique_ptr,这些智能指针会在对象不再被使用时自动调用析构函数。

在某些情况下,如果需要将指针转换为 void 指针,但仍需要保证析构函数被调用,可以使用 dynamic_cast 将 void 指针转换回原始类型的指针,然后显式调用析构函数。但是,这种方法需要特别小心,以避免出现内存泄漏或其他问题。

总之,当类型转换为 void 指针时,析构函数不会被调用。为了确保对象的析构函数被正确调用,建议使用智能指针或避免将指针转换为 void 指针。

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

相关·内容

七、构造函数与析构函数

七、构造函数与析构函数 构造函数 在C++中,构造函数是一种特殊的成员函数,它用于初始化类的对象。当创建类的对象时,构造函数会被自动调用。...当obj离开其作用域(在main函数的末尾)时,它的析构函数会被自动调用,输出"MyClass对象被销毁",并释放了动态分配的内存。 注意: 析构函数不能被显式调用(即不能直接调用obj....析构函数可以是虚函数,这在处理基类指针指向派生类对象(多态)时非常重要。通过将基类的析构函数声明为虚函数,可以确保在删除基类指针时调用正确的析构函数(即派生类的析构函数)。...拷贝构造: 当使用另一个同类型的对象来初始化一个新对象时,拷贝构造函数会被调用。 拷贝构造函数有两种主要形式:浅拷贝和深拷贝。浅拷贝只是复制对象的指针,而深拷贝会复制指针指向的实际数据。...如果使用new运算符在堆上动态分配的对象,则当delete运算符被用于该对象时,析构函数会被调用。 调用顺序: 在销毁派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数。

13810

C++基础知识

使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。...当我们调用 release()时,当前指针会释放资源所有权,计数减一。当计数等于 0 时,资源会被释放。...pa,pb 之间互相引用,两个资源的引用计数为 2,当要跳出函数时,智能指针 pa,pb 析构时两个资源引用计数会减一,但是两者引用计数还是为 1,导致跳出函数时资源没有被释放(A B 的析构函数没有被调用...析构函数 析构函数与构造函数对应,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。...析构函数与虚函数 析构函数必须是虚函数,因为将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们 new 一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏

1.4K32
  • 【c++】全面理解C++多态:虚函数表深度剖析与实践应用

    的析构函数,下面的delete对象调用析构函数,才能构成多态,才能保证p1和p2指向的对象正确的调用析构函数 class Person { public: virtual ~Person() { cout...这意味着只有基类的析构代码会被执行,而派生类的析构逻辑不会调用,可能导致资源泄露或其他问题。...其中 p2 是一个基类 Person 类型的指针,指向一个 Student 对象),Student 的析构函数首先会被调用(子类),然后是 Person 的析构函数(基类) 因此,重写基类的虚拟析构函数确保了当通过基类指向派生类对象的指针进行...delete 操作时,能够按照正确的顺序调用派生类和基类的析构函数 派生类可以不写virtual class Person { public: virtual void BuyTicket() {...由于在C++中,一个包含虚函数的对象在内存起始地址处通常存储着指向虚表的指针,因此这步操作实际上获取的是指向 Derive 虚表的指针 (VFPTR*) 将 int 类型的值强制转换为 VFPTR* 类型

    33800

    C++ 异常机制分析

    如果指针所指向的变量在执行catch语句时已经被销毁,对指针进行解引用将发生意想不到的后果。 throw出一个表达式时,该表达式的静态编译类型将决定异常对象的类型。...所以当throw出的是基类指针的解引用,而该指针所指向的实际对象是派生类对象,此时将发生派生类对象切割。 除了抛出用户自定义的类型外,C++标准库定义了一组类,用户报告标准库函数遇到的问题。...允许派生类到基类的类型转换。 数组被转换成指向数组(元素)类型的指针。 函数被转换成指向函数类型的指针。...我们知道,在函数调用结束时,函数的局部变量会被系统自动销毁,类似的,throw可能会导致调用链上的语句块提前退出,此时,语句块中的局部变量将按照构成生成顺序的逆序,依次调用析构函数进行对象的销毁。...异常处理技术在不同平台以及编译器下的实现方式都不同,但都会给程序增加额外的负担,当异常处理被关闭时,额外的数据结构、查找表、一些附加的代码都不会被生成,正是因为如此,对于明确不抛出异常的函数,我们需要使用

    1.8K61

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

    假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。...析构函数没有参数,也没有返回值,而且不能重载,在一个类中只能有一个析构函数。当撤销对象时,编译器也会自动调用析构函数。...假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。...1) 对象生命周期结束,被销毁时; 2) delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时; 3) 对象i是对象o的成员,o的析构函数被调用时,对象i...动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源 常用的智能指针 (1) shared_ptr 实现原理:采用引用计数器的方法,允许多个智能指针指向同一个对象,每当多一个指针指向该对象时

    2.4K40

    计算机考研复试C语言常见面试题「建议收藏」

    使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域时,类会自动调用析构函数,析构函数会自动释放资源。...当计数等于0时,资源会被释放。 weak_ptr 当两个对象同时使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效,从而导致内存泄露。...为什么C++默认的析构函数不是虚函数 析构函数设置为虚函数可以保证我们new一个子类时,可以使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。...C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。...19、类构造和析构顺序 构造: 基类成员对象的构造函数 基类的构造函数 子类成员对象的构造函数 子类的构造函数 析构: 子类的析构函数 子类成员的析构函数 基类的析构函数 基类成员的析构函数 两者正好相反

    1.6K30

    C++内存分区模型分析与实例以及扩展

    ,因此构造函数相当于一个入口点,这个入口点负责虚函数调用的前期工作,这个入口点当然不可能是虚函数;8,析构函数可以成为虚函数: 1,析构函数在对象销毁之前被调用,对象销毁之前意味着虚函数指针是正确的指向对应的虚函数表的...; 2,建议在设计类时将析构函数声明为虚函数(工程中设计一个父类的析构函数为虚函数); 1,赋值兼容性申请子类对象给父类指针时,当 delete 作用在指针上时,编译器会直接根据指针类型(此时是父类...)来调用相应的析构函数,若父类加上 virtual,编译器可以根据指针指向的实际对象(此时是子类)决定如何调用析构函数(多态);9,构造、析构、虚函数编程实验:#include #include...,因此在这样情况下,编译器直接根据指针 p 的类型来决定调用哪一个构造函数,由于指针 p 的类型是父类的类型,所以编译器直接暴力认为调用父类构造函数就可以了;当将父类的虚函数声明为 virtual 时,...编译器就不会简单的根据指针 p 的类型来简单调用父类的或者是子类的析构函数了,这个时候由于析构函数是虚函数,所以在执行这行代码的时候,编译器会根据指针 p 指向的实际对象来决定如何调用析构函数,这是多态

    79841

    Chapter 4: Smart Pointers

    局部对象也许不会被销毁 调用了 std::abort,std::_Exit,std::exit 或者 std::quick_exit 函数,对象一定不会被销毁 给 std::unique_ptr 传入自定义析构器..., std::unique_ptr 的大小不再等于原始指针的大小 当自定义析构器是函数指针时, std::unique_ptr 的大小从 1 个字长变为 2 个字长 当自定义析构器是函数对象时, std...在这个情况下,调用者从工厂函数中收到智能指针,然后由调用者来决定它的声明周期,而当指向某个 id 最后一个使用的指针销毁时,对象也会被销毁,那么缓存中的指针就会悬空,因此在后续查询的时候需要检测命中的指针是否已经悬空...为了解决这个问题,我们需要在析构函数调用时,确保 Widget::pImpl 是一个完整的类型,也就是当 Widget 的 Impl 在 Widget.cpp 中定义之后,类型是完整的,关键就是让编译器在看到...)指针指向的类型必须是完整的 std::shared_ptr 中,自定义析构器不是指针对象的一部分,也就不要求在编译生成的特定函数(析构函数,移动函数)对象中指针指向的类型是完整的 7.Summary

    1.6K20

    C++相关基础知识总结笔记

    自动调用:当对象的生命期结束时(例如,对象离开作用域或删除动态分配的对象),析构函数会自动调用。 对于栈上的对象,析构函数在其作用域结束时调用。...不能带参数:析构函数不能带有任何参数。 析构函数的类型 默认析构函数:如果类中没有显式定义析构函数,编译器会自动生成一个默认析构函数。默认析构函数不执行任何操作。...用户定义的析构函数:如果需要在对象销毁时执行特定的操作,可以显式定义析构函数。 析构函数的调用顺序 局部对象:在函数退出时,局部对象的析构函数按照构造的逆序被调用。...派生类和基类:当一个类继承自另一个类时,派生类的析构函数会在基类的析构函数之前被调用。 如果派生类的析构函数没有显式调用基类的析构函数,则默认调用基类的析构函数。...虚析构函数的作用,没有虚析构会导致什么后果 虚析构函数(Virtual Destructor)是一个虚函数,用于确保当通过基类指针删除派生类对象时,派生类的析构函数也能被正确调用,没有虚析构会导致资源泄露

    21330

    【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :...或 父类引用 , 此处可以直接传入 子类指针 或 子类引用 ; // 函数接收父类指针类型 // 此处可以传入子类对象的指针 void fun_pointer(Parent* obj) { obj...{ cout 函数" << endl; } }; // 函数接收父类指针类型 // 此处可以传入子类对象的指针 void fun_pointer...// 子类对象 可以调用 父类公有函数 child.funParent(); // 将指向子类对象的指针传给接收父类指针的函数 // 也是可以的 fun_pointer...类型兼容性原则 : 父类指针 指向 子类对象 Parent* p_parent2 = NULL; p_parent2 = &child; // 通过父类指针调用父类函数

    30920

    C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

    delete的实现过程:对指针指向的对象运行适当的析构函数;然后通过调用名为operator delete的标准库函数释放该对象所用内存 11、虚函数是什么以及其作用?...注意:构造函数不能为虚函数,但是析构函数可以为虚函数,并且虚析构函数可以防止父类指针销毁子类对象时不正常导致的内存泄漏。 12、C++中struct和class的区别?...由于类的多态性,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。...将析构函数声明为虚函数,在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生,要将基类的析构函数声明为虚函数。

    2.2K20

    《C++Primer》第十三章 拷贝控制

    ;析构函数定义了当此类型对象销毁时做什么。...参数和返回值 在函数调用过程中,具有非引用类型的参数要进行拷贝初始化 当一个函数具有非引用的返回类型时,返回值会被用来初始化调用方的结果 拷贝构造函数被用来初始化非引用类类型参数,这一特性解释了为什么拷贝构造函数自己的参数必须是引用类型...内置类型无析构函数,因此销毁内置类型成员什么也不做。 隐式销毁一个内置指针类型的成员不会delete它指向的对象。但是智能指针是类类型,所以具有析构函数,因此指向的对象在析构阶段会被销毁。...无论何时一个对象被销毁,就会自动调用其析构函数: 变量离开其作用域时被销毁 当一个对象被销毁时,其成员被销毁 容器(无论是标准库容器还是数组)被销毁时,其元素被销毁 对于动态分配的对象,当对指向它的指针使用...这些函数简单拷贝指针成员,这意味着多个HasPtr对象可能指向相同的内存。那么析构函数会导致多个HasPtr对象被销毁时delete相同的指针多次,这是未定义的行为。

    1.6K40

    什么?CC++面试过不了?因为你还没看过这个!

    它指向调用该成员函数的那个对象。 当对一个对象调用成员函数时,编译程序先将对象的地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用 this 指针。...当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。...; shape2 = nullptr; return 0; } 虚析构函数 虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象。...,所以delete释放内存时,先调用子类析构函数,再调用基类析构函数,防止内存泄漏。...(析构调用 delete),unique_ptr 可以管理数组(析构调用 delete[] ); 强制类型转换运算符 static_cast 用于非多态类型的转换 不执行运行时类型检查(转换安全性不如

    3.7K50

    C语言与C++面试知识总结

    它指向调用该成员函数的那个对象。 当对一个对象调用成员函数时,编译程序先将对象的地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用 this 指针。...当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。...; shape2 = nullptr; return 0; } 虚析构函数 虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象。...,所以delete释放内存时,先调用子类析构函数,再调用基类析构函数,防止内存泄漏。...(析构调用 delete),unique_ptr 可以管理数组(析构调用 delete[] ); 强制类型转换运算符 static_cast 用于非多态类型的转换 不执行运行时类型检查(转换安全性不如

    5K41

    第 15 章 面向对象程序设计

    所以,不存在从基类向派生类的隐式类型转换,但“存在”派生类向基类的转换(只对指针和引用有效、对象类型的话派生类部分会被切断)。...而对于派生类中覆盖的虚函数,其形参必须相同,返回类型也要与基类匹配。而当虚函数的返回类型是类本身的指针或引用且可进行类型转换时,也是允许的。 ?...---- 15.7 构造函数与拷贝控制 当需要 delete一个的基类指针时,该指既可以指向基类对象,也可以指向派生类对象,此时编译器必须明确执行基类或派生类的指针。...析构函数的虚属性会被继承,无论派生类中使用合成的析构函数还是自定义的析构函数,都将是虚函数。这样,就能保证 delete基类指针时总能运行正确的析构函数版本。...假如基类析构函数不是虚函数,且指针的静态类型与动态类型不一致,则此时只能调用基类的析构函数,那派生类对象的部分则无法完成析构,从而产生未定义行为。

    1K30

    C++ 继承

    ; } }; 基类于派生类之间的转换 public继承的派生类 可以 被 基类的指针 或 引用 派生类的指针或引用不可以指向基类 基类的指针或者引⽤可以通过强制类型转换赋值给派⽣类的指针或者引⽤。...但是必须是基类的指针是指向派⽣类对象时才是安全的。...= 0; A::b = 0; } }; 派生类型的默认成函数 先说结论:建议你都要写 而且把基类的部分要单独看成一个内置类型 都要调用基类的玩意 析构时派生先析构..._b; A::operator=(x); } } int _b; }; 派生类型的析构函数会被调用玩后自动带哦用基类的析构函数清理基类成员,要保证先清理派生类型后清理基类...,所以不用再派生的析构里写基类的析构函数 派生类初始化会先调用基类构造再调用派生构造 派生对象析构清理会先调用派生后调用基类 因为多态中⼀些场景析构函数需要构成重写

    4610

    工作中常见的几种内存泄漏场景汇总

    但是当传入参数为0时,运行代码后抛出异常。进程退出,异常信息如下图所示: 从结果可以看出,抛出异常后代码退出,但是类的析构函数没有被调用。...3、基类中的析构函数引发的内存泄露 在C++中,如果子类的对象是通过基类的指针进行删除,如果基类的析构函数不是虚拟的,那么子类的析构函数可能不会被调用,从而导致派生类资源没有被释放,进而产生内存泄漏。...,并指向其子类对象,随后对基类指针进行释放,本意是想通过对基类指针释放同时也调用子类的析构函数释放子类资源。...这是因为,在基类中并没有定义析构函数,在这种情况下,编译器会为我们默认生成一个析构函数,但还不够智能,生成的析构函数不是虚拟的,这样在对基类指针进行析构时就不能调用子类析构函数释放资源。...但是这样做就破坏了delete的工作原理,delete删除对象时,先调用对象的析构函数,再delete指针对象,上面的代码在将pBase转换成void*后,delete获取不到析构对象的类型就不能正确调用对象的析构函数

    1.1K20

    《逆袭进大厂》之C++篇49问49答

    33、为什么析构函数一般写成虚函数 由于类的多态性,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。...所以将析构函数声明为虚函数是十分必要的。在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生,要将基类的析构函数声明为虚函数。...只有在基类析构函数定义为虚函数时,调用操作符delete销毁指向对象的基类指针时,才能准确调用派生类的析构函数(从该级向上按序调用虚函数),才能准确销毁数据。...在构造子类对象时,会先调用父类的构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类的虚表;当调用子类的构造函数时,为子类对象初始化虚表指针,令它指向子类的虚表 (4)当派生类对基类的虚函数没有重写时

    2K10

    《逆袭进大厂》之C++篇49问49答(绝对的干货)

    33、为什么析构函数一般写成虚函数 由于类的多态性,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。...所以将析构函数声明为虚函数是十分必要的。在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生,要将基类的析构函数声明为虚函数。...只有在基类析构函数定义为虚函数时,调用操作符delete销毁指向对象的基类指针时,才能准确调用派生类的析构函数(从该级向上按序调用虚函数),才能准确销毁数据。...在构造子类对象时,会先调用父类的构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类的虚表;当调用子类的构造函数时,为子类对象初始化虚表指针,令它指向子类的虚表 (4)当派生类对基类的虚函数没有重写时

    2.6K40

    智能指针探究

    当一个CSmartPtr对象被销毁时,它的析构函数会被调用 在这个析构函数中,首先调用mpRefCnt->delRef()来减少指向的对象的引用计数。然后,检查返回的引用计数是否为零。...这就是为什么调用delete mptr;来删除指向的对象 需要注意的是,这段代码并不会调用指向的对象的析构函数。析构函数是在delete mptr;这一行被调用时自动调用的。...当使用new操作符创建一个新的对象时,会为该对象分配内存,并调用其构造函数来初始化它。当不再需要这个对象时,应该使用delete操作符来删除它。...因为当pa和pb离开作用域并被销毁时,它们的析构函数会被调用。...这意味着,这些对象不会被删除,它们的析构函数也不会被调用 记住只有当引用计数变为0,指向的对象才会被删除,才会调用析构函数 上面这些话可能有点绕,结合我上面对这个代码的分析,可以理解下 ~CSmartPtr

    9110
    领券