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

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

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

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

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

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

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

相关·内容

七、构造函数函数

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

9510

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* 类型

    30400

    C++ 异常机制分析

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

    1.8K61

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

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

    2.3K40

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

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

    79141

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

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

    1.6K30

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

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

    19930

    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++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

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

    2.1K20

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

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

    1.6K40

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

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

    3.7K50

    第 15 章 面向对象程序设计

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

    1K30

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

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

    5K41

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

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

    28420

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

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

    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

    8610

    基础知识_Cpp

    所以可以利用类的构造函数函数,将需要分配资源的对象进行一层封装,将其获取资源和释放资源分别绑定到构造函数函数里,这样对象生命周期结束,就会自己释放资源。...如何限制类只能在堆或栈上创建对象 1.编译器在为类对象分配栈空间,会先检查类的函数的访问性,其实不光是函数,只要是非静态的函数,编译器都会进行检查。...(使用delete会报错,因为delete对象指针,会调用对象函数,而函数类外不可访问)这种使用方式比较怪异。...一个类中含有对象指针,如果把该类的一个对象复制给另一个对象,这时会导致两个对象中的指针指向同一块内存,此时一个对象销毁,可能会导致另一个对象中的指针指向的内容被销毁。...,需要自己手动调用函数

    2K30
    领券