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

C++创建Library对象时因heap corruption触发c0000374断点错误求助

问题根因

  • 数组越界写破坏堆结构:resizeBookArray 函数中,你申请的 newBookArr 数组长度为 bookscount,合法下标范围是 0 ~ bookscount-1,但你执行了 newBookArr[bookscount] = book,直接越界写入了堆末尾的内存,破坏了堆的管理结构。同时函数中还有一行多余的 bookArr = new Book[bookscount];,不仅造成内存泄漏,还会直接覆盖刚申请的新数组指针,进一步加剧内存错误。
  • 成员变量被局部变量遮蔽:copyBookArray 函数中你重新定义了局部变量 Book* bookArr = new Book[bookscount];,这个局部变量和类的成员变量 bookArr 重名,导致类成员的 bookArr 在 delete[] 之后没有被赋值为新的数组地址,一直是野指针,后续访问直接触发内存错误。
  • 相等判断逻辑反转:Book 类的 operator== 直接返回 strcmp 的结果,而 strcmp 两个字符串相等时返回0,也就是相等时 operator== 返回 false,不相等时返回 true,逻辑完全反转,导致已经存在的图书会被重复添加,数组扩容的次数远超预期,进一步加重越界问题。
  • 堆损坏的延时触发特性:上述内存错误在 readBooksItems 往 library1 中添加图书时就已经发生,破坏了堆的内部结构,当执行 Library library2("2") 申请新的堆内存时,堆管理器检测到堆结构已经被破坏,才抛出 c0000374 异常,所以异常触发点不是问题的实际发生点。

修复方案

  1. 修复 resizeBookArray 函数,删除多余的内存申请语句,修正数组下标:
void resizeBookArray(Book book) {
    bookscount++;
    Book* newBookArr = new Book[bookscount];
    for (int i = 0; i < bookscount-1; i++)
    {
        newBookArr[i] = bookArr[i];
    }
    delete[] bookArr;
    // 删除多余的 bookArr = new Book[bookscount]; 语句
    newBookArr[bookscount - 1] = book; // 修正下标
    bookArr = newBookArr;
    newBookArr = nullptr;
}
  1. 修复 copyBookArray 函数,去掉局部变量定义,直接操作成员变量:
void copyBookArray(Book* bArr) {
    delete[] bookArr;
    bookArr = new Book[bookscount]; // 不要加 Book* 声明,直接操作成员变量
    for (int i = 0; i < bookscount; i++)
    {
        bookArr[i] = bArr[i];
    }
}
  1. 修正 Book 类的 operator== 逻辑:
friend bool operator== (Book b1, Book b2) {
    return (strcmp(b1.bookid, b2.bookid) == 0); // 相等时返回true
}
  1. 补充 Library 类的析构函数,避免内存泄漏:
~Library() {
    delete[] bookArr;
}
  1. 可选优化:将赋值运算符、重载函数的参数改为常量引用,减少不必要的对象拷贝,提高性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:54:08