C++析构函数自动调用与内存泄漏相关技术咨询
解答你的C++析构函数与内存泄漏疑问
嘿,我来帮你把这两个问题掰扯清楚:
1. 析构函数的自动调用 & 非动态变量的销毁
首先明确:C++里的析构函数是会自动调用的——只要对象的生命周期正常走到尽头:比如栈上的对象离开它的作用域时,或者堆上用new创建的对象被delete时,对应的析构函数都会自动触发执行。
至于那些非动态变量(比如你代码里的int x、int y这类成员),你完全不用操心它们的销毁:这些变量是和对象本身绑定在一起的,当对象的内存被回收时,这些成员的内存会被一并释放。对于int这种基本类型来说,它们的“销毁”就是简单的内存释放,编译器会自动安排这个过程,根本不需要你在析构函数里写任何相关代码。
2. 给定代码的内存泄漏分析
先看你贴的这段代码(顺便补个小细节:原代码里class B { int x; }末尾少了分号,我帮你补上了):
class B { int x; }; class A { int x; int y; B* tab[10]; public: A(int x, int y){ this->x = x; this->y = y; for (int i = 0; i < 10; i++){ tab[i] = new B; } } ~A(){ for (int i = 0; i < 10; i++){ delete tab[i]; } } }; int main(){ A a(10, 10); return 0; }
结论:这段代码完全没有内存泄漏
- 关于
B* tab[10]里的指针:你在A的构造函数里用new创建了10个B对象,然后在A的析构函数里逐个用delete释放了这些对象,这部分完全符合C++的内存管理规则,不会有泄漏。 - 你担心的
int x和int y:这俩是A的非动态成员变量,属于栈上对象a的一部分。当main函数结束时,a离开作用域,A的析构函数自动被调用,等析构函数执行完,a占用的所有内存(包括x和y的空间)都会被系统自动回收,根本不会造成内存泄漏。
关于重写析构函数的小提醒
你担心重写默认析构函数会引发意外泄漏——其实只要你在自定义析构函数里正确清理了动态分配的资源(比如这里new出来的B对象),就完全没问题。默认析构函数只会自动处理非动态成员,不会管你手动new出来的堆内存,所以当类里有指向堆资源的指针时,必须自定义析构函数来释放这些资源,你现在的写法是完全正确的。
内容的提问来源于stack exchange,提问作者Please be gentle
相关产品推荐
相关产品推荐

