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异常,所以异常触发点不是问题的实际发生点。
修复方案
- 修复
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; }
- 修复
copyBookArray函数,去掉局部变量定义,直接操作成员变量:
void copyBookArray(Book* bArr) { delete[] bookArr; bookArr = new Book[bookscount]; // 不要加 Book* 声明,直接操作成员变量 for (int i = 0; i < bookscount; i++) { bookArr[i] = bArr[i]; } }
- 修正
Book类的operator==逻辑:
friend bool operator== (Book b1, Book b2) { return (strcmp(b1.bookid, b2.bookid) == 0); // 相等时返回true }
- 补充
Library类的析构函数,避免内存泄漏:
~Library() { delete[] bookArr; }
- 可选优化:将赋值运算符、重载函数的参数改为常量引用,减少不必要的对象拷贝,提高性能。
内容的提问来源于stack exchange,提问作者Hamza Umair
相关产品推荐
相关产品推荐

