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

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

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

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

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

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

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

相关·内容

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

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

98120

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

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

93000

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

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

61320

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

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

56810

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

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

1.1K10

C++多态特性

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

12870

C++之

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

42910

计算机考研复试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")

43110

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

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

95420

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

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

96620

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

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

1.5K20

C++知识概要

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

1.1K20

什么时候使用函数

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

86820

硬核 | C++ 基础大全

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

1.2K10

C++基础知识

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

1.4K32

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

假设中采用的是非虚函数,当删除指针指向的派生对象时就不会触发动态绑定,因而只会调用函数,而不会调用派生函数。...1) C++中采用virtual函数是为了防止内存泄漏。 具体地说,如果派生中申请了内存空间,并在其函数中对这些内存空间进行释放。...假设中采用的是非虚函数,当删除指针指向的派生对象时就不会触发动态绑定,因而只会调用函数,而不会调用派生函数。...那么在这种情况下,派生中申请的空间就得不到释放从而产生内存泄漏。 所以,为了防止这种情况的发生,C++中函数应采用virtual函数。...因此,缺乏任何一个函数的定义,就会导致链接失败,最好不要把函数定义为纯函数

2.3K40

C++多态特性详解

(与派生函数返回值类型不同) 不一定返回自己的父或者子类,别的父或者子类也可以: 2.函数的重写: 如果父函数函数,此时子类函数只要定义,无论是否加virtual...关键字, 都与父函数构成重写,虽然与派生函数名字不同。...看下面这个场景: 因为有切片的概念,父指针可以指向子类,注意看这里调用了两次父,但我们new出来的时一个父和一个子类,这里看似没什么影响,但我们稍微对子类修改一下 : 这时如果不调用子类的就会造成内存泄漏...,解决办法: 结论:建议将函数写成函数,防止内存泄漏。...此时D中的结构就如下图: 指针的知识我以后会讲 。 注意:表是存在常量区的,不是存在里面,只是指针存在的头4个或者8个字节。 面试题: 该程序运行的结果是什么?

7810

【C++深度探索】全面解析多态性机制(一)

* f() { return new Student; }//派生函数返回值类型为派生指针或引用 }; 函数的重写(与派生函数的名字不同) 如果函数函数,此时派生函数只要定义...,无论是否加virtual关键字,都与函数构成重写,虽然与派生函数名字不同。...new Person; Person* p2 = new Student; delete p1; delete p2; return 0; } 结果如下: 如果是这样,那么如果子类Student中动态开辟了一块空间而没有调用合适的函数就会造成内存泄漏...,派生函数会自动调用函数。...因此,可以重写(覆盖)函数,以处理派生特有的资源清理需求。 尤其是父函数强力建议设置为函数,这样动态释放父指针所指的子类对象时,能够达到的多态。

9610

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

注意:构造函数不能为函数,但是函数可以为函数,并且函数可以防止父指针销毁子类对象时不正常导致内存泄漏。 12、C++中struct和class的区别?...大小是4 return 0; } 19、简单描述内存泄漏内存泄漏一般是指堆内存泄漏,也就是程序在运行过程中动态申请的内存空间不再使用后没有及时释放,导致那块内存不能被再次使用。...由于的多态性,指针可以指向派生的对象,如果删除指针,就会调用该指针指向的派生函数,而派生函数又自动调用函数,这样整个派生的对象完全被释放。...如果函数不被声明成函数,则编译器实施静态绑定,在删除指针时,只会调用函数而不调用派生函数,这样就会造成派生对象不完全,造成内存泄漏。...将函数声明为函数,在实现多态时,当用操作派生,在时防止只而不派生的状况发生,要将函数声明为函数

1.9K20
领券