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

为什么数组中一个对象的析构函数在被另一个对象替换时没有被调用?

在C++中,当一个对象被另一个对象替换时,其析构函数不会被调用。这是因为对象的析构函数只有在对象被销毁时才会被调用,而对象的替换并不会导致对象的销毁。

当一个对象被另一个对象替换时,实际上是将一个对象的值赋给了另一个对象。这个过程只是简单地将对象的成员变量的值复制给另一个对象的对应成员变量,并没有涉及到对象的销毁和创建过程。因此,被替换的对象的析构函数不会被调用。

如果你希望在对象被替换时调用析构函数,可以使用指针或引用来管理对象的生命周期。通过使用指针或引用,可以在对象不再需要时手动调用析构函数来销毁对象。例如,可以使用智能指针(如std::shared_ptr)来管理对象的生命周期,确保在对象不再被引用时自动调用析构函数。

需要注意的是,析构函数的主要作用是在对象销毁时释放资源,例如释放动态分配的内存或关闭打开的文件。如果对象被替换时不需要释放任何资源,那么不调用析构函数也是合理的。

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

相关·内容

【C++】匿名对象 ③ ( 函数返回值为对象 匿名对象 拷贝构造函数函数 调用情况分析 )

Student fun() { Student s1(18, 170); return s1; } 二、当函数返回值为对象情况分析 ---- 1、函数返回对象返回值为匿名对象 如果一 函数返回值...fun 函数中 , 函数返回对象 , 创建 要返回 普通对象副本 , 也就是一 匿名对象 ; 调用函数 : m_age = 12 这是 fun 函数执行完毕 , 在函数作用域中 普通对象...执行结果如下 : 调用带参数构造函数 m_age = 18 调用带参数构造函数 m_age = 12 调用拷贝构造函数 调用函数 : m_age = 12 调用函数 : m_age = 12...m_age = 12 这是在 fun 函数中 , 调用 有参构造函数 , 创建 普通对象 ; 调用拷贝构造函数 这是在 fun 函数中 , 函数返回对象 , 创建 要返回 普通对象副本 , 也就是一...匿名对象 ; 调用函数 : m_age = 12 这是 fun 函数执行完毕 , 在函数作用域中 普通对象 需要被销毁 ; 调用函数 : m_age = 12 这是在 main 函数

26020

C++学习知识点

(3)尽量将基类函数定义为虚函数,当利用delete删除一指向派生类定义对象指针,系统会调用相应函数。而不将函数定义为虚函数,只调用基类函数。...为什么基类类型指针在被子类对象赋值后不能访问子类成员函数呢?...对象赋给另外一对象引用或者指针,如何传递对象赋给另外一对象引用或者对象时候,将调用赋值拷贝构造函数。此时就存在深拷贝和浅拷贝。...如果只是简简单单进行浅拷贝,也就是值拷贝,会出现一对象后,另一个对象成员变量,比如指针会指向释放内存空间,这就是指针悬挂问题。此时就需要手动书写拷贝构造函数,完成深拷贝。...(3) 函数返回值是类对象,在函数调用结束,需要将函数对象复制一临时对象并传给改函数调用处。 12.

1.7K20

c++面试选择题_C语言经典笔试题

2.delete与 delete []区别 delete只会调用一次函数,而delete[]会调用每一数组元素函数。...在More Effective C++中有更为详细解释:“当delete操作符用于数组,它为每个数组元素调用函数,然后调用operator delete来释放内存。”...简单来说,用new分配内存用delete删除;用new[]分配内存用delete[]删除。delete[]会调用数组元素函数。内部数据类型没有函数,所以问题不大。...4.子类调用父类函数吗? 函数调用次序是先派生类后基类,也就是说在基类调用时候,派生类信息已经全部销毁了。...定义一对象调用基类构造函数、然后调用派生类构造函数时候恰好相反:先调用派生类函数、然后调用基类函数

1.1K10

面试总结-C++

malloc仅仅分配内存空间,free仅仅回收空间,不具备调用构造函数函数功能,用malloc分配空间存储类对象存在风险;new和delete除了分配回收功能外,还会调用构造函数函数。...当delete一对象数组,delete只删除了一,需要使用delete[] const 宏定义和const函数区别 宏在编译完成替换,直接进行替换,执行起来更快,但是可能会存在一些风险;函数调用在运行时需要跳转到具体调用函数...见为什么不能建立引用数组 将引用作为函数参数,可以避免对变量或者对象复制,因此不会调用对象拷贝构造函数。当不希望传入引用参数不被改变,使用const引用。...调用情况: 用一对象去初始化该类另一个对象。...由于unwind机制保证,当异常发生函数栈内已构造局部对象函数会被一一调用,在函数内释放资源,也就杜绝了内存泄漏问题。 2.做好程序设计。

2.1K11

C++经典面试题(最全,面中率最高)

2.delete与 delete []区别 delete只会调用一次函数,而delete[]会调用每一成员函数。...在More Effective C++中有更为详细解释:“当delete操作符用于数组,它为每个数组元素调用函数,然后调用operator delete来释放内存。”...简单来说,用new分配内存用delete删除;用new[]分配内存用delete[]删除。delete[]会调用数组元素函数。内部数据类型没有函数,所以问题不大。...4.子类调用父类函数吗? 函数调用次序是先派生类后基类,也就是说在基类调用时候,派生类信息已经全部销毁了。...定义一对象调用基类构造函数、然后调用派生类构造函数时候恰好相反:先调用派生类函数、然后调用基类函数

1.1K30

轻松搞定面试中“虚”

因为纯虚函数是不能调用,包含纯虚函数类是无法建立对象。 抽象类作用是作为一类族共同基类,或者说,为一类族提供一公共接口。 3.为什么有的类函数需要设为virtual?...是否每个类函数都要设置成virtual?是否可以将函数设置成内联函数。 这样做是为了当用一基类指针删除一派生类对象,派生类函数会被调用。...所以,只有当一用来作为基类时候,才把函数写成虚函数。 可以。 4.函数是否可以是纯虚函数? 可以,当需要定义一抽象类,如果其中没有其他合适函数,可以把函数定义为纯虚。...显然是:当我们构造一子类对象,先调用基类构造函数,构造子类中基类部分,子类还没有构造,还没有初始化,如果在基类构造中调用函数,如果可以的话就是调用没有初始化对象,那是很危险,所以...在时候会首先调用子类函数对象子类部分,然后在调用基类函数基类部分,如果在基类函数里面调用函数,会导致其调用已经子类对象里面的函数,这是非常危险

65820

硬核 | C++ 基础大全

当两智能指针都是 shared_ptr 类型时候,资源引用计数会减一,但是两者引用计数还是为 1,导致跳出函数资源没有释放(函数没有调用),解决办法:把其中一改为weak_ptr...举例来说就是,一基类指针指向一派生类对象,在使用完毕准备销毁,如果基类函数没有定义成虚函数,那 么编译器根据指针类型就会认为当前对象类型是基类,调用基类函数 (该对象函数函数地址早就被绑定为基类函数...函数没有参数,也没有返回值,而且不能重载,在一类中只能有一函数。当撤销对象,编译器也会自动调用函数。...当数据成员中没有指针,浅拷贝是可行。 但当数据成员中有指针,如果采用简单浅拷贝,则两类中指针指向同一地址,当对象快要结束,会调用两次函数,而导致指野指针问题。...函数函数体被执行; 如果 class 拥有成员类对象,而后者拥有函数,那么它们会以其声明顺序相反顺序调用; 如果对象有一 vptr,现在被重新定义 如果有任何直接上一层非虚基类拥有函数

1.2K10

c++面试题

在More Effective  C++中有更为详细解释:“当delete操作符用于数组,它为每个数组元素调用函数,然后调用operatordelete来释放内存。”...内部数据类型没有函数,所以问题不大。如果你在用delete没用括号,delete就会认为指向是单个对象,否则,它就会认为指向是一数组。 3.C和C++ 共同点?不同之处?...6.子类调用父类函数吗?...函数调用次序是先派生类后基类,也就是说在基类调用时候,派生类信息已经全部销毁了定义一对象调用基类构造函数、然后调用派生类构造函数时候恰好相反:先调用派生类函数...、然后调用基类函数JAVA无函数深拷贝和浅拷贝 7.多态,虚函数,纯虚函数 多态:是对于不同对象接收相同消息产生不同动作。

1.2K11

C++面试知识总结

2.6 new/delete和malloc/free区别 new/delete用调用构造函数来实例化对象调用函数释放对象申请资源。...2.7 delete和delete[]区别 delete只会调用一次函数,delete[]会调用每一成员函数。...引用一旦初始化为指向一对象,它就不能改变为另一个对象引用。 指针在任何时候都可以改变为指向另一个对象。 引用创建和销毁并不会调用拷贝构造函数。...3.5 基类和子类构造、顺序 定义一对象调用基类构造函数、然后调用派生类构造函数 先派生类后基类,也就是说在基类调用时候,派生类信息已经全部销毁了 3.6 深拷贝与浅拷贝区别...  3.8 函数特点 函数名称固定:~类名( ) 没有返回类型,没有参数 不可以重载,一般由系统自动调用 3.8 公有继承、私有继承、受保护继承 公有继承,派生类对象可以访问基类中公有成员

1.7K41

Lua连续教程之Lua垃圾收集

器 虽然垃圾收集器目标是回收对象,但是它可以帮助程序员来释放外部资源。处于这种目的,几种编程语言提供了器。器是一对象关联函数,当该对象即将被回收函数会被调用。...如果后续再设置元方法也不会有问题,只要元方法正确函数,Lua语言就能够调用它。 当垃圾收集器在同一周期中多个对象,它会按照对象标记为需要处理顺序逆序调用这些对象器。...所以,关联并不会影响器执行顺序。 有关一微妙之处是复苏。当一调用时,它参数是正在被对象。因此,这个对象会至少在期间重新编程活跃。笔者把这称为临时复苏。...由于Lua语言在对象上设置了标记,每一对象器都会精确地运行一次。如果一对象直到程序运行结束还没有回收,那么Lua语言就会在整个Lua虚拟机关闭后调用器。...首先,Lua语言遍历所有标记为需要进行、但又没有标记为活跃状态对象。这些没有标记为活跃状态对象会被标记为活跃,并放在一单独列表中,这个列表会在阶段用到。

1.5K10

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

宏在编译完成替换,之后替换文本参与编译,相当于直接插入了代码,运行时不存在函数调用,执行起来更快;函数调用在运行时需要跳转到具体调用函数。...如果该变量是一寄存器变量或者表示一端口数据或者是多个线程共享数据,就容易出错,所以说volatile 可以保证对特殊地址稳定访问。 37、为什么函数一般写成虚函数?...由于类多态性,基类指针可以指向派生类对象,如果删除该基类指针,就会调用该指针指向派生类函数,而派生类函数又自动调用基类函数,这样整个派生类对象完全释放。...如果函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针,只会调用基类函数而不调用派生类函数,这样就会造成派生类对象不完全,造成内存泄漏。...将函数声明为虚函数,在实现多态,当用基类操作派生类,在防止只基类而不派生类状况发生,要将基类函数声明为虚函数

1.9K20

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

3、 需要在 new [] 一对象数组,需要保存数组维度,C++ 做法是在分配数组空间多分配了 4 个字节大小,专门保存数组大小,在 delete [] 就可以取出这个保存数,就知道了需要调用函数多少次了...函数没有参数,也没有返回值,而且不能重载,在一类中只能有一函数。当撤销对象,编译器也会自动调用函数。...77、构造函数函数可以调用函数吗,为什么 1) 在C++中,提倡不在构造函数函数调用函数; 2) 构造函数函数调用函数都不使用动态联编,如果在构造函数函数调用函数,...,在销毁一对象,先调用子类函数,然后再调用基类函数。...1) 对象生命周期结束,销毁; 2) delete指向对象指针,或delete指向对象基类类型指针,而其基类虚构函数是虚函数; 3) 对象i是对象o成员,o函数调用时,对象i

2.3K40

【专业技术】你必须注意11C++要点

所以,当你通过指针调用函数成员,这个调用将会被动态回收。另一个需要注意地方,你不能取一构造函数函数地址。...因为b占了4字节,所以就很自然地把它当作一形式排列,而a和c大小1+1=2,再加上2字节就刚好按两个字形式排列B。 要点10、为什么继承一没有函数类是危险?...一没有函数类意味着不能做为一基类。如std::string,std::complex, 和 std::vector 都是这样为什么继承一没有函数类是危险?...当你公有继承创建一从基类继承相关类,指向新类对象指针和引用实际上都指向了起源对象。因为函数不是虚函数,所以当你delete一这样,C++就不会调用函数链。...{ // ... } }; int main() { A * p = new B; //看上去是对 delete p; //错,B没有调用 } 要点11、以友元类声明嵌套类 当你以友元类声明一嵌套

97450

《Effective C++》学习笔记

对于一些可能在被别的类直接调用其成员函数、值类,最好改为暴露一返回其类对象引用函数形式,而不是暴露其类对象本身,这可以保证在函数内完成初始化,避免调用时还没有初始化。...构造//赋值运算 条款05:了解C++默默编写并调用哪些函数没有声明时,编译器会自动为类创建默认构造函数函数、复制构造函数和赋值构造函数,但如果成员变量中包含引用、const这些不能改变值...条款09:绝不在构造和过程中调用函数 在构造函数函数中不要去调用函数,因为子类在构造/,会调用父类构造/函数,此时其中函数调用父类实现,但这是父类函数可能是纯虚函数...如果想调用父类构造函数来做一些事情,替换做法是:在子类调用父类构造函数,向上传递一值给父类构造函数。...用tr1::function成员变量替换函数,从而允许包括函数指针在内任何可调用物搭配一兼容于需求签名式。 将虚函数也做成另一个继承体系类,然后在调用类中添加一指针来指向其对象

1.1K20

精选 30 C++ 面试题(含解析)

2.delete和delete []区别 delete只会调用一次函数,而delete[]会调用每一成员函数函数。...在More Effective C++中有更为详细解释:“当delete操作符用于数组,它为每个数组元素调用函数,然后调用operator delete来释放内存。”...简单来说,用new分配内存用delete删除;用new[]分配内存用delete[]删除。delete[]会调用数组元素函数。内部数据类型没有函数,所以问题不大。...3.C++有哪些性质(面向对象特点) 封装、继承和多态 4.子类调用父类函数吗?...定义一对象调用基类构造函数、然后调用派生类构造函数时候恰好相反:先调用派生类函数、然后调用基类函数。 5.介绍多态、虚函数和纯虚函数

55830

C++程序员经常问11问题

如:转态过程函数、登记功能函数都是必须在实际程序运行前调用。最简单办法是通过一全局对象 构造函数调用这些函数。...所以,当你通过指针调用函数成员,这个调用将会被动态回收。另一个需要注意地方,你不能取一构造函数函数地址。...因为b占了4字节,所以就很自然地把它当作一形式排列,而a和c大小1+1=2,再加上2字节就刚好按两个字形式排列B。 要点10、为什么继承一没有函数类是危险?    ...一没有函数类意味着不能做为一基类。如std::string, std::complex, 和 std::vector 都是这样为什么继承一没有函数类是危险?...当你公有继承创建一从基类继承相关类,指向新类对象指针和引用实际上都指向了起源对 象。因为函数不是虚函数,所以当你delete一这样,C++就不会调用函数链。

84520

C++面试题汇总 (一)

delete与 delete []区别 delete只会调用一次函数,而delete[]会调用每一成员函数。...在More Effective C++中有更为详细解释:“当delete操作符用于数组,它为每个数组元素调用函数,然后调用operator delete来释放内存。”...简单来说,用new分配内存用delete删除;用new[]分配内存用delete[]删除。delete[]会调用数组元素函数。内部数据类型没有函数,所以问题不大。...子类调用父类函数吗? 函数调用次序是先派生类后基类,也就是说在基类调用时候,派生类信息已经全部销毁了。...定义一对象调用基类构造函数、然后调用派生类构造函数时候恰好相反:先调用派生类函数、然后调用基类函数

84020

C++从入门到精通——类6默认成员函数函数

在C++中,函数是一种特殊成员函数,用于在对象销毁清理其使用资源。它名称与类名称相同,前面加上一波浪线(~),没有返回类型,也不接受任何参数。...Time类对象为什么最后会调用Time类函数?...但是:main函数 中不能直接调用Time类函数,实际要释放是Date类对象,所以编译器会调用Date类函数,而Date没有显式提供,则编译器会给Date类生成一默认函数,目的是在其内部调用...Time 类函数,即当Date对象销毁,要保证其内部每个自定义对象都可以正确销毁 main函数中并没有直接调用Time类函数,而是显式调用编译器为Date类生成默认函数 注意:创建哪个类对象调用该类函数...,销毁那个类对象调用该类函数 如果类中没有申请资源函数可以不写,直接使用编译器生成默认函数,比如Date类;有资源申请,一定要写,否则会造成资源泄漏,比如Stack类。

20910

【编程基础】如何赢得C++面试

1.new、delete、malloc、free关系 delete会调用对象函数,和new对应是free,free只会释放内存,new调用构造函数。...对于非内部数据类型对象而言,光用maloc/free无法满足动态对象要求。对象在创建同时要自动执行构造函数对象在消亡之前要自动执行函数。...2.delete与delete []区别 delete只会调用一次函数,而delete[]会调用每一成员函数。 3.有哪些性质(面向对象特点) 封装,继承和多态。...4.子类调用父类函数吗? 函数调用次序是先派生类后基类,也就是说在基类调用时候,派生类信息已经全部销毁了。...定义一对象调用基类构造函数、然后调用派生类构造函数时候恰好相反:先调用派生类函数、然后调用基类函数 5.C++中class和struct区别 从语法上,在C++中(只讨论

1.4K70

C++快速入门

int &fun(){//要将函数名前加上& static int n; n++; return n;//返回一引用 } 內联函数 将被调用函数函数体直接嵌入在被调用处,这种函数叫做內联函数...函数 函数是用来完成对象在生命周期结束前释放内存空间用。在对象生命周期结束前会由系统自动调用。...函数特点: 是一公有函数 函数名与类名相同 没有参数 没有返回值 用~开头 不定义函数系统会自动生成一空参、不做任何操作函数。...当使用new创建对象就必须定义函数,在函数内部用delete释放内存空间 #include using namespace std; class Student{...浅拷贝会存在一问题,由于拷贝前后对象同时指向同一块内存空间,所以当这两对象时候,同一片空间会被两次,如果第一次将存储空间释放后,在第二次之前,这块空间又已经存放了其他数据,此时第二次了这块空间

83150
领券