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

删除基类指针不带虚析构函数会不会导致内存泄漏?

是的,删除基类指针不带虚析构函数会导致内存泄漏。

当一个类被继承时,如果基类的析构函数不是虚函数,那么当通过基类指针删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。这就会导致派生类中可能存在的资源没有被正确释放,从而造成内存泄漏。

为了解决这个问题,应该将基类的析构函数声明为虚函数。这样,在通过基类指针删除派生类对象时,会先调用派生类的析构函数,然后再调用基类的析构函数,确保所有资源得到正确释放。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各种业务需求。产品介绍链接
  • 腾讯云云数据库MySQL版:提供高性能、可扩展的MySQL数据库服务。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端存储服务。产品介绍链接
  • 腾讯云人工智能:提供丰富的人工智能服务和解决方案,包括图像识别、语音识别、自然语言处理等。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

函数? vptr? 指针偏移?多态数组? delete 指针 内存泄漏?崩溃?

.从而就导致函数被调用了,而派生函数没有调用这个问题发生....如果没有这样做的话,只会输出函数,这种输出情况通过比对规则2也可以理解,pI 现在虽然指向派生对象首地址,但执行pI->~IRectangle() 时 发现不是函数,故直接调用, 假如在派生函数内有释放内存资源的操作...将函数改成函数,fun() 最好也改成函数,只要有一个函数大小就为一个vptr ,此时和派生大小都是4个字节,p也指向派生的首地址,问题解决,参考规则3。...也是论坛上经常讨论的,也就是说delete 指针(在指针没有偏离的情况下) 会不会造成内存泄漏的问题,上面说到如果此时函数函数,那么是不会内存泄漏的,如果不是则行为未定义。.../test )检测,并没有内存泄漏和派生函数也正常被调用。

1K20

函数? vptr? 指针偏移?多态数组? delete 指针 内存泄漏?崩溃?

.从而就导致函数被调用了,而派生函数没有调用这个问题发生....如果没有这样做的话,只会输出函数,这种输出情况通过比对规则2也可以理解,pI 现在虽然指向派生对象首地址,但执行pI->~IRectangle() 时 发现不是函数,故直接调用, 假如在派生函数内有释放内存资源的操作...将函数改成函数,fun() 最好也改成函数,只要有一个函数大小就为一个vptr ,此时和派生大小都是4个字节,p也指向派生的首地址,问题解决,参考规则3。...也是论坛上经常讨论的,也就是说delete 指针(在指针没有偏离的情况下) 会不会造成内存泄漏的问题,上面说到如果此时函数函数,那么是不会内存泄漏的,如果不是则行为未定义。.../test )检测,并没有内存泄漏和派生函数也正常被调用。

96400
  • 【C++】多态 ⑤ ( 函数 | 函数语法 | 函数意义 | 父指针指向子类对象情况下父和子类使用 virtual 函数 | 代码示例 )

    子类 中覆盖 父函数 ; 场景说明 : A , B 继承 A ; 声明一个 A 类型 的指针变量 , 为其赋值 B 类型对象的地址 , 当需要释放该指针变量时 , 使用...类型的 函数 ; 释放 A 类型的指针 , 需要调用其子类 B 类型对象的 函数 , 此时需要将 A 类型 和 B 类型的 函数 声明为 函数 ; 3、函数语法 函数 的...; 当使用 父 指针指向一个 子类 对象时 , 如果要通过 delete 释放该指针指向的对象 , 如果是正常的函数 , 没有 使用 virtual 定义函数 , 则只会调用 父函数..., 子类的函数不会被调用到 ; 函数 可以确保 首先调用 子类 的 函数 , 然后调用 父函数 ; 这样可以 避免在 释放 子类对象 时出现 资源泄漏 的情况 ; 需要注意的是...函数 1、代码示例 - 没有使用函数导致子类函数无法调用 在下面的代码中 , 声明 子类指针 指向 子类对象 , 释放 子类指针 时 先调用 子类函数 , 再调用父函数 ; 声明

    1.1K20

    C++编程经验(2):为函数的必要性

    这个要提一下,如果记不住就记住:如果不做函数,会有内存泄漏 解释 定义一个指针p,在delete p时,如果函数函数,这时只会看p所赋值的对象,如果p赋值的对象是派生的对象,...就会调用派生函数;如果p赋值的对象是的对象,就会调用函数,这样就不会造成内存泄露。...如果函数不是函数,在delete p时,调用函数时,只会看指针的数据类型,而不会去看赋值的对象,这样就会造成内存泄露。 多少学点设计模式就清楚了。...Inherit :public Base{ //此处省去,一切从简 }; //重点看调用 int main() { Base *p = new Inherit; //这种方式的调用,这时候有没有就不一样了

    58510

    C++为什么要引入智能指针

    智能指针通过封装原始指针的操作,提供自动化的内存管理机制,以减少这些问题的发生。具体来说,智能指针的几个主要优点和引入的原因包括: 自动内存管理:智能指针在其函数中自动释放所管理的内存。...示例:int* ptr = new int[100]; delete ptr; // 错误,应使用delete[]函数未定义为函数: 场景描述:在函数未定义为函数的情况下,通过指针删除派生对象时...,只会调用函数,从而导致派生部分成员的内存未被释放。...示例:A和派生B,A的函数未定义为函数,通过A的指针删除B的对象。...将函数定义为函数: 如果指针可能被用来指向派生对象,那么函数应该被定义为函数,以确保通过指针删除派生对象时能够调用到派生函数

    10410

    解锁C++多态的魔力:灵活与高效的编码艺术(上)

    指针指向派生对象时,如果删除对象时函数不是函数,那么调用的仅仅是函数,而不会调用派生函数。这样,派生中分配的资源就无法释放,导致内存泄漏或其他资源管理问题。...派生中可能分配的资源未被释放,导致潜在的内存泄漏。...2.4.2 使用函数 通过将函数声明为函数,可以确保正确调用派生函数,避免内存泄漏问题: #include class Base { public:...2.4.3 函数的注意事项 函数的必要性:任何含有函数都应定义函数,以确保派生对象通过指针删除时能够正确。...() {} // 提供函数体 总结 函数确保通过指针删除派生对象时正确调用派生函数,避免内存泄漏

    11310

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

    C++中采用virtual函数是为了防止内存泄漏 具体地说,如果派生中申请了内存空间,并在其函数中对这些内存空间进行释放。...假设中采用的是非虚函数,当删除指针指向的派生对象时就不会触发动态绑定,因而只会调用函数,而不会调用派生函数。...那么在这种情况下,派生中申请的空间就得不到释放从而产生内存泄漏。所以,为了防止这种情况的发生,C++中函数应采用virtual函数。...ps: 内存泄漏是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 8、哪些函数不能声明成函数?...简单来说,用new分配的内存用delete删除;用new[]分配的内存用delete[]删除。内部数据类型没有函数,所以问题不大。

    1.2K10

    C++多态特性

    函数的特殊情况: 斜变 派生重写函数时,与函数返回值类型不同。 函数返回对象的指针或者引用. 派生函数返回派生对象的指针或者引用时....已扣除5元餐费." << endl; return nullptr; } }; 运行结果: 2.1 函数可以是函数吗? 显然,与派生函数的名字不同 ....为什么函数要实现多态? 因为函数实现多态了以后,才能实现在和派生时,各自调用自己的函数,防止内存泄漏!...delete p1; delete p2; //arr2未释放 return 0; } 运行结果: 显然,在未实现多态的情况下,当指针指向派生时,调用函数都只能调用函数....这就导致了派生存在成员变量并没有释放空间,也就导致内存泄漏!

    13770

    C++之

    在继承的时候,父指针(或引用)可以指向(引用)子类的对象。如果子类有自己的指针属性,那么就需要将父函数声明为函数,否则通过父指针(或者引用)无法调用子类的函数。...= this->name) { free(this->name); this->name = nullptr; } cout << "函数" << endl; } }...delete对象指针s的时候,并没有调用派生函数,这造成了内存泄漏。如果有很多都是父指针指向子类对象的,并且程序一致不结束,那么这将是非常可怕的。为此C++为我们提供了。...有了就不用太过担心内存泄漏的发生。 当我们在父声明函数。那么这时候delete对象指针s就不会有内存泄漏发生。 ?...函数是为了解决这样的一个问题:指针指向派生对象,并用指针删除派生对象。 当一个不作为使用的时候不要把它的函数声明为函数,这样会增加一个函数表。使的体积增大。

    43710

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

    为什么C++默认的函数不是函数 8 17、函数指针 9 18、fork函数 9 19、构造和顺序 9 20、静态函数函数的区别 10 21、静态多态与动态多态 10 22、const修饰普通函数与成员函数的目的...使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个,当超出了的作用域时,会自动调用函数函数会自动释放资源。...为什么C++默认的函数不是函数 函数设置为函数可以保证我们new一个子类时,可以使用指针指向该子类对象,释放指针时可以释放掉子类的空间,防止内存泄漏。...C++默认的函数不是函数是因为函数需要额外的函数表和指针,占用额外的内存。而对于不会被继承的来说,其函数如果是函数,就会浪费内存。...19、构造和顺序 构造: 成员对象的构造函数 的构造函数 子类成员对象的构造函数 子类的构造函数 : 子类的函数 子类成员的函数 函数 成员的函数 两者正好相反

    1.6K30

    C++多态之和纯分析与示例

    问题产生原因:因为是用的父指针指向的子类对象Animal *animal = new Cat("Tom");所以当用delete父指针时不会走子类的导致子类如果有堆区的数据会出现内存的泄露情况...通过父指针去释放,会导致子类对象可能清理不干净,造成内存泄漏 怎么解决?...给增加一个函数 函数就是用来解决通过父指针释放子类对象时不干净的问题 class Animal { public: Animal() { cout << "Animal 构造函数调用...void test01() { Animal *animal = new Cat("Tom"); animal->Speak(); //通过父指针去释放,会导致子类对象可能清理不干净,造成内存泄漏...给增加一个函数 //函数就是用来解决通过父指针释放子类对象 delete animal; } int main() { test01(); system("pause")

    45010

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

    3、中的函数引发的内存泄露 在C++中,如果子类的对象是通过指针进行删除,如果函数不是虚拟的,那么子类的函数可能不会被调用,从而导致派生资源没有被释放,进而产生内存泄漏。...,并指向其子类对象,随后对指针进行释放,本意是想通过对指针释放同时也调用子类的函数释放子类资源。...这是因为,在中并没有定义函数,在这种情况下,编译器会为我们默认生成一个函数,但还不够智能,生成的函数不是虚拟的,这样在对指针进行时就不能调用子类函数释放资源。...如果想要达到我们想要的效果,只需将中的函数定义成即可。修改后运行结果如图所示: 可见,子类中的资源得到正常释放。...,因此导致对象可能产生内存泄漏

    1K20

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

    派生:当一个继承自另一个时,派生函数会在函数之前被调用。 如果派生函数没有显式调用函数,则默认调用函数。...如果函数函数(virtual destructor),则派生函数会正确调用函数。...函数的规则 函数:如果希望在派生中正确调用函数,可以将函数声明为函数。 例如,virtual ~BaseClass();。...函数的作用,没有导致什么后果 函数(Virtual Destructor)是一个函数,用于确保当通过指针删除派生对象时,派生函数也能被正确调用,没有导致资源泄露...避免资源泄露:避免由于派生函数没有被调用而导致的资源泄露问题。 抽象的使用 抽象,即纯的内部成员函数全部是纯函数

    19820

    什么是内存泄漏?防止内存泄露的方法?

    浏览量 3 什么是内存泄漏? 动态分配内存所开辟的空间,在使用完毕后未手动释放,导致一直占据该内存,即为内存泄漏。...内存泄漏的分类 1.堆内存泄漏内存泄漏指的是程序运行中根据需要通过malloc,realloc,new等从堆中分配的一块内存,完成后没有调用对应的free,delete进行释放,或者是程序错误导致这部分内存没有被释放...,这块内存将不会被使用,就产生了堆内存泄漏。...2.系统资源泄漏 主要是指程序使用系统分配的资源,比如Bitmap,handle,socket等没有使用相应的函数释放掉,导致系统资源浪费,严重可导致系统效能降低,系统运行不稳定。...3.未将函数定义为函数指针指向子类对象时,如果函数不是virtual,那么子类的函数将不会被调用,子类的资源没有正确的释放,因此造成内存泄漏。 如何防止内存泄漏

    98920

    C++ 万字长文第一篇---拿下字节面试

    函数在每次删除对象的时候调用,函数名称和名相同,但在前面加了一个 符号,同样无返回类型。若对象在调用过程中用 动态分配了内存,可以在函数中写 语句统一释放内存。...假设存在继承:孙继承父,父继承爷构造过程:爷 -> 父 -> 孙过程:孙 -> 父 -> 爷 函数函数 可能作为继承父函数需要设置成函数,这样可以保证当一个指针指向其子类对象并释放指针的时候...函数需要额外的函数表和函数指针,占用额外的内存,所以不会作为继承父函数不用设置成函数,否则会浪费内存。...在有函数中,存在一个函数指针,该指针指向一张函数表,当子类继承的时候,也会继承其函数表。...使用智能指针可以很大程度的避免这个问题,因为智能指针是一个,超出的作用范围后,会调用函数释放资源,所以智能指针的作用原理就是在函数结束后自动释放内存空间。

    1.6K20

    C++知识概要

    另外,virtual 函数是在不同类型的对象产生不同的动作,现在对象还没有产生,也就不能使用 virtual 函数来完成你想完成的动作 函数为什么要函数 C++中采用 virtual 函数是为了防止内存泄漏...假设中采用的是非虚函数,当删除指针指向的派生对象时就不会触发动态绑定,因而只会调用函数,而不会调用派生函数。...构造函数函数可以调用函数吗 在构造函数函数中最好不要调用函数 构造函数或者函数调用函数并不会发挥函数动态绑定的特性,跟普通函数没区别 即使构造函数或者函数如果能成功调用函数...带有一个函数 带有一个 合成的默认构造函数中,只有子对象和成员对象会被初始化。...派生指针转换为指针指针会不会变 将一个派生指针转换成某一个指针,编译器会将指针的值偏移到该在对象内存中的起始位置 C 语言的编译链接过程 源代码-->预处理-->编译-->

    1.1K20

    什么时候使用函数

    问题 什么时候该定义函数,为什么要这么做? 回答 当你通过一个指针删除(delete)派生对象的时候,函数就很用了。...Base 的函数定义为(virtual)。...,有可能会造成内存泄漏,而解决这个问题的办法就是将 Base 的函数定义为(virtual), class Base { public: Base(){ cout <<...,否则你就应该定义为, 这个没有派生 不在堆(heap)内存实例化 没有指向派生指针或引用 对于 1,还是很常见的,有的时候我们只是单纯的写一个,并没有派生它的打算,那这个时候就无需将它的函数定义为...对于 3,基本上也不太可能,派生的存在基本上都会用到它的指针和引用。

    90020

    【C++】42道面试经典问题总结

    str;str[2] 4.array内存不可扩容的数组 5.字符串处理,没有添加’\0’字符,导致访问字符串的时候越界· 6.使用类型强转,让一个大类型(派生)的指针指向一块小内存对象)...构造函数不可以使函数函数可以是函数 构造函数不能是函数,因为对象还没有构造出来,也就没有函数指针,没有函数指针也就无法指向函数表。...函数,把函数实现成函数,则对函数的调用进行动态绑定,、派生函数就都可以调用到 构造函数函数中能不能抛出异常?...构造函数不能抛出异常,如果可以抛出异常的话,假如对象创建失败,则就不会调用函数了,从而造成内存泄漏(可以进行代码分离,保证对象创建是成功的,函数也就可以正常执行) 函数也不能抛出异常,抛出异常后...,函数后面资源释放的代码就不会执行了,也会造成造成内存泄漏 所以一般把堆内存用智能指针来代替,确保资源内存正常释放 宏和内联函数的区别?

    9210

    硬核 | C++ 基础大全

    函数一般写成函数的原因 直观的讲:是为了降低内存泄漏的可能性。...举例来说就是,一个指针指向一个派生的对象,在使用完毕准备销毁时,如果函数没有定义成函数,那 么编译器根据指针类型就会认为当前对象的类型是,调用函数 (该对象的函数函数地址早就被绑定为函数...),仅执行,派生的自身内容将无法被,造成内存泄漏。...如果函数定义成函数,那么编译器就可以根据实际对象,执行派生函数,再执行函数,成功释放内存。...函数顺序 调用派生函数; 调用成员对象的函数; 调用函数

    1.2K10

    C++基础知识

    即A内部有指向B,B内部有指向A,这样对于A,B必定是在A后B才,对于B,A必定是在B后才A,这就是循环引用问题,违反常规,导致内存泄露。...所以许多简单的中没有用显式的函数。 如果一个中有指针,且在使用的过程中动态的申请了内存,那么最好显示构造函数在销毁之前,释放掉申请的内存空间,避免内存泄漏。...顺序 派生本身的函数 对象成员函数 函数 因为函数没有参数,所以包含成员对象的函数形式上并无特殊之处。...函数函数 函数必须是函数,因为将可能会被继承的父函数设置为函数,可以保证当我们 new 一个子类,然后使用指针指向该子类对象,释放指针时可以释放掉子类的空间,防止内存泄漏...C++默认的函数不是函数是因为函数需要额外的函数表和指针,占用额外的内存。而对于不会被继承的来说,其函数如果是函数,就会浪费内存

    1.4K32
    领券