You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:48:02