C++自定义模板容器使用string类型触发堆损坏错误(退出码3221226356)求助
问题根因
你的程序崩溃的直接原因是动态内存分配与释放不匹配,触发了堆损坏:
- 你在
allocate函数中首次分配内存用的是单对象分配语法new T,后续扩容时用的是数组分配语法new T[Capacity],但所有释放内存的位置(clear函数、allocate扩容分支)都统一用单对象释放语法delete,没有和数组分配对应的delete []。 int属于基础POD类型,没有自定义析构函数,这种混用大概率不会触发运行异常;但std::string是带有自定义析构函数的复杂类型,delete释放数组内存时无法正确调用所有元素的析构函数,会破坏堆的管理结构,最终导致崩溃,你遇到的退出码3221226356就是Windows平台下堆损坏的标准错误码。- 额外的小问题:头文件引用应为小写的
<string>,<String>是非标准写法,部分编译器可能报错。
修复步骤
- 统一所有内存分配为数组形式,修改
allocate函数的首次分配逻辑:
template <class T> void container<T>::allocate(T* &temp) { if(Capacity == 0){ temp = new T[1]; // 把原来的new T改成new T[1],统一数组分配 Capacity = 1; }else{ Capacity *= 2; T *tmp = new T[Capacity]; for(int i = 0; i <= n; i++) { tmp[i] = temp[i]; } delete [] temp; // 把原来的delete temp改成delete [] temp temp = tmp; } }
- 修改
clear函数的释放逻辑,匹配数组分配:
template <class T> void container<T>::clear() { delete [] arr; // 把原来的delete arr改成delete [] arr arr = nullptr; Capacity = 0; n = -1; }
- (可选)修正头文件引用为
#include <string>,符合C++标准。
修改后即可正常存储std::string类型,不会出现堆损坏崩溃。
内容的提问来源于stack exchange,提问作者atanaka
相关产品推荐
相关产品推荐

