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

C++自定义模板容器使用string类型触发堆损坏错误(退出码3221226356)求助

问题根因

你的程序崩溃的直接原因是动态内存分配与释放不匹配,触发了堆损坏:

  • 你在allocate函数中首次分配内存用的是单对象分配语法new T,后续扩容时用的是数组分配语法new T[Capacity],但所有释放内存的位置(clear函数、allocate扩容分支)都统一用单对象释放语法delete,没有和数组分配对应的delete []。
  • int属于基础POD类型,没有自定义析构函数,这种混用大概率不会触发运行异常;但std::string是带有自定义析构函数的复杂类型,delete释放数组内存时无法正确调用所有元素的析构函数,会破坏堆的管理结构,最终导致崩溃,你遇到的退出码3221226356就是Windows平台下堆损坏的标准错误码。
  • 额外的小问题:头文件引用应为小写的<string>,<String>是非标准写法,部分编译器可能报错。
修复步骤
  1. 统一所有内存分配为数组形式,修改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;
    }
}
  1. 修改clear函数的释放逻辑,匹配数组分配:
template <class T>
void container<T>::clear()
{
    delete [] arr; // 把原来的delete arr改成delete [] arr
    arr = nullptr;
    Capacity = 0;
    n = -1;
}
  1. (可选)修正头文件引用为#include <string>,符合C++标准。

修改后即可正常存储std::string类型,不会出现堆损坏崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:27:05