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

C++自定义MYString类存vector后foreach遍历出现指针释放未分配内存错误

问题排查与修复方案

核心问题定位

你遇到的"Pointer being freed was not allocated"报错来自两个核心错误:

1. 默认构造函数未正确初始化成员

你只在类中声明了MYString()默认构造函数,没有给出实现,C++自动生成的默认构造不会初始化指针和数值成员,导致:

  • 默认构造的对象中str是野指针,cap、end为随机值
  • 后续调用赋值运算符、析构函数时,clear()方法对野指针执行delete[] str,直接触发内存释放错误

2. 堆缓冲区溢出破坏内存结构

你的赋值运算符实现存在越界风险:
cap是字符数组的总长度,你将'\0'存在下标end的位置,当end == cap时,str[end] = '\0'会超出数组边界,破坏堆内存的控制结构,操作系统在后续内存释放时会检测到异常,触发报错。

额外说明

你的拷贝构造函数、析构函数、clear()本身逻辑没有问题,拷贝构造用赋值运算符实现的写法是合法的,delete[] nullptr属于C++标准规定的合法操作,不会引发报错。

修复代码

1. 补全默认构造函数

MYString::MYString() {
    cap = INITIAL_CAP;
    end = 0;
    str = new char[cap];
    str[end] = '\0';
}

如果你需要初始为空的构造,也可以按下面实现,保证str初始为nullptr即可:

MYString::MYString() : str(nullptr), cap(0), end(0) {}

2. 调整容量计算逻辑

确保requiredCap函数返回的容量至少为end + 1,保证能容纳末尾的'\0',避免越界。例如:

int MYString::requiredCap(int end) {
    // 按20的倍数向上取整,额外预留1位存结束符
    int need = end + 1;
    return ((need + INITIAL_CAP - 1) / INITIAL_CAP) * INITIAL_CAP;
}

3. 优化clear函数顺序(非强制,符合代码规范)

void MYString::clear(){
    delete[] str;
    str = nullptr;
    cap = 0;
    end = 0;
}

其他注意事项

  • 主函数中文件打开失败后直接输出错误就继续执行,此时input >> s会直接失败,v中只有一个默认构造的对象,如果你用空构造的实现,需要确保operator<<能处理str为nullptr的情况。
  • 检查operator+的实现,确保返回的临时MYString对象成员正确初始化,没有内存越界问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:45:01