C++自定义Queue类中new分配的queue指针应在哪里调用delete释放?
问题解答
1. 动态申请的内存必须释放
C++没有自动垃圾回收机制,你通过new[]申请的堆内存如果不主动释放,会产生内存泄漏:只要程序不退出,这块长度为100的int数组占用的内存就不会被系统回收,如果你的代码中频繁创建销毁Queue对象,内存占用会持续升高,最终可能导致程序OOM崩溃。
2. delete语句的正确位置
2.1 核心位置:类的析构函数
类的析构函数会在对象生命周期结束时自动调用,是做资源清理的最佳位置。注意你申请的是数组,必须使用delete[]而不是普通的delete来释放。
你需要给Queue类补充如下析构函数:
public: ~Queue() { delete[] queue; }
2.2 额外补充:处理拷贝语义避免重复释放
当前你没有自定义拷贝构造函数和拷贝赋值运算符,编译器会生成默认的浅拷贝实现:如果两个Queue对象发生拷贝,它们内部的queue指针会指向同一块内存空间,当两个对象都销毁时,会对同一块内存执行两次delete[],直接导致程序崩溃。
针对这个问题有两种常用解决方案:
- 方案一:禁用拷贝构造和拷贝赋值,禁止对象拷贝(如果你不需要拷贝语义推荐使用该方案)
public: Queue(const Queue&) = delete; Queue& operator=(const Queue&) = delete;
- 方案二:自定义拷贝构造和拷贝赋值,实现深拷贝
public: Queue(const Queue& other) { size = other.size; queue = new int[100]; for(int i=0; i<size; i++) { queue[i] = other.queue[i]; } } Queue& operator=(const Queue& other) { if(this == &other) return *this; delete[] queue; // 先释放自身原来的内存 size = other.size; queue = new int[100]; for(int i=0; i<size; i++) { queue[i] = other.queue[i]; } return *this; }
- 额外提示:你当前的
add函数没有做边界校验,当size达到100时再调用add会发生数组越界,属于未定义行为,建议补充边界判断逻辑。
内容的提问来源于stack exchange,提问作者Kbreezy15
相关产品推荐
相关产品推荐

