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

自定义c_string类addElement函数内存泄漏问题的最优解决方法咨询

修复自定义字符串类中的内存泄漏问题

你定位的内存泄漏问题非常准确:在原代码中,delete chain;之后执行了chain = new char[chain_total];,紧接着又将chain赋值为tmpChain——这导致刚通过new分配的内存块失去了所有引用,永远无法被释放,最终造成内存泄漏。

修复后的addElement实现

void c_string::addElement(char ch)
{
    char *tmpChain = new char[chain_total + 1];

    // 复制原有字符串数据
    for(size_t i = 0; i < chain_total; i++)
        tmpChain[i] = chain[i];
    // 添加新字符并更新字符串长度
    tmpChain[chain_total++] = ch;

    // 释放旧内存(注意用delete[]匹配new[])
    delete[] chain;
    // 直接让chain指向预先分配好的新内存,无需额外new操作
    chain = tmpChain;
}

关键修复点说明

  • 移除了多余的chain = new char[chain_total];语句:tmpChain已经是为新字符串长度分配好的内存,直接复用即可,无需重复分配。
  • 修正了内存释放方式:原代码用delete chain;释放数组是错误的,因为chain是通过new[]分配的数组,必须用delete[]来释放,否则会触发未定义行为。

进一步优化:降低频繁内存分配的开销(可选)

每次添加字符都重新分配内存的效率极低,你可以引入预分配容量的策略,减少内存分配和数据复制的次数:

class c_string
{
private:
    char *chain;
    size_t chain_total; // 当前字符串实际长度
    size_t capacity;    // 已分配的内存总容量
public:
    c_string() : chain(nullptr), chain_total(0), capacity(0) {}
    ~c_string() { delete[] chain; }
    void addElement(char ch);
};

void c_string::addElement(char ch)
{
    // 容量不足时进行扩容,初始容量设为16,之后每次翻倍
    if (chain_total >= capacity)
    {
        size_t new_capacity = (capacity == 0) ? 16 : capacity * 2;
        char *tmpChain = new char[new_capacity];
        
        // 复制原有数据
        for(size_t i = 0; i < chain_total; i++)
            tmpChain[i] = chain[i];
        
        delete[] chain;
        chain = tmpChain;
        capacity = new_capacity;
    }
    // 添加新字符
    chain[chain_total++] = ch;
}

内容的提问来源于stack exchange,提问作者Ninja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:36:07