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

C++析构函数运行异常导致ColoredBox对象cb2无法创建显示

代码问题分析及修复方案

核心问题梳理

  • 野指针非法访问:类成员length、width为int指针类型,构造函数未为其分配堆内存,直接解引用赋值属于未定义行为,可能导致程序崩溃、死循环、异常输出等问题。你测试时单独运行cb2逻辑能正常执行属于未定义行为的巧合,delete cb1时析构函数的非法内存释放操作破坏了堆结构,才导致后续创建cb2时程序异常。
  • 内存释放语法错误:析构函数使用delete[]释放内存,该语法仅对应new[]分配的数组内存,即使你正确分配了单个int的内存,也应该使用delete而非delete[]。
  • 传参顺序错误:构造函数声明为ColoredBox(int boxlen, int boxwid, char charac = '#', int colo = 15),创建cb2时你写的new ColoredBox(len, wid, col, boxChar)参数顺序完全不匹配,将int类型的颜色传给了char参数,char类型的字符传给了int颜色参数,导致属性赋值错误。

修复方案

推荐方案:去掉不必要的指针定义

length和width仅为普通数值存储,完全不需要用指针实现,修改成本最低:

  1. 修改类私有成员定义:
private:
  // 把int*改成普通int
  int length;
  int width;
  char character;
  int color;
  int maxarea;
  1. 修改构造函数:
ColoredBox(int boxlen, int boxwid, char charac = '#', int colo = 15) {
  length = boxlen;
  width = boxwid;
  character = charac;
  color = colo;
  maxarea = 0;
}
  1. 把所有代码中用到*length、*width的地方直接替换为length、width。
  2. 析构函数删除delete相关语句,改为空实现即可。
  3. 修正cb2的传参顺序:
cb2 = new ColoredBox(len, wid, boxChar, col);

保留指针的修复方案

如果要求必须用指针存储长宽:

  1. 构造函数先分配内存再赋值:
ColoredBox(int boxlen, int boxwid, char charac = '#', int colo = 15) {
  length = new int;
  width = new int;
  *length = boxlen;
  *width = boxwid;
  character = charac;
  color = colo;
  maxarea = 0;
}
  1. 修改析构函数释放逻辑:
~ColoredBox() {
  delete length;
  delete width;
}
  1. 同样修正cb2的传参顺序即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:06:00