C++函数入参中new创建对象析构未触发及内存泄漏问题咨询
#include<iostream> #include<stdlib.h> using namespace std; class car { public: string name; int num; public: car(string a, int n) { cout << "Constructor called" << endl; this->name = a; this->num = n; } ~car() { cout << "Deleted" << endl; } }; void display(car* p) { cout << "Name: " << p->name << endl; cout << "Num: " << p->num << endl; } int main() { display(new car("HYUNDAI", 2012)); }
问题1:析构函数未被调用的原因
C++中new创建的是堆内存对象,生命周期由开发者手动管控,只有对对应指针执行delete操作时,才会触发析构函数执行,同时释放对应的堆内存。你的代码中仅在传参时通过new创建了对象,全程没有调用delete,因此析构函数不会执行。
栈对象和堆对象的生命周期逻辑不同:栈分配的对象出作用域时会自动调用析构函数,堆分配的对象没有自动回收逻辑,必须手动delete。
问题2:该写法是否会引发内存泄漏
会引发内存泄漏。你通过new申请的堆内存,在display函数执行完成后,没有任何指针持有该内存的首地址,你也无法再对这块内存执行delete操作,程序运行过程中这块内存会一直被占用,直到程序退出后才会由操作系统统一回收,属于典型的内存泄漏场景。
修复方案
方案1:手动管理内存
提前保存new返回的指针,使用完成后手动delete:
int main() { car* my_car = new car("HYUNDAI", 2012); display(my_car); delete my_car; // 手动释放,触发析构函数执行 return 0; }
方案2:使用智能指针自动管理(C++11及以上版本支持)
用std::unique_ptr/std::shared_ptr托管堆对象,不需要手动释放,指针出作用域时会自动调用析构、释放内存:
#include <iostream> #include <memory> using namespace std; class car { // 类定义和原有逻辑一致 public: string name; int num; public: car(string a, int n) { cout << "Constructor called" << endl; this->name = a; this->num = n; } ~car() { cout << "Deleted" << endl; } }; void display(unique_ptr<car> p) { cout << "Name: " << p->name << endl; cout << "Num: " << p->num << endl; } int main() { display(make_unique<car>("HYUNDAI", 2012)); // 无需手动释放,智能指针出作用域自动回收 return 0; }
内容的提问来源于stack exchange,提问作者Thuan Khang
相关产品推荐
相关产品推荐

