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仅为普通数值存储,完全不需要用指针实现,修改成本最低:
- 修改类私有成员定义:
private: // 把int*改成普通int int length; int width; char character; int color; int maxarea;
- 修改构造函数:
ColoredBox(int boxlen, int boxwid, char charac = '#', int colo = 15) { length = boxlen; width = boxwid; character = charac; color = colo; maxarea = 0; }
- 把所有代码中用到
*length、*width的地方直接替换为length、width。 - 析构函数删除
delete相关语句,改为空实现即可。 - 修正cb2的传参顺序:
cb2 = new ColoredBox(len, wid, boxChar, col);
保留指针的修复方案
如果要求必须用指针存储长宽:
- 构造函数先分配内存再赋值:
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; }
- 修改析构函数释放逻辑:
~ColoredBox() { delete length; delete width; }
- 同样修正cb2的传参顺序即可。
内容的提问来源于stack exchange,提问作者Mohamed Tarek
相关产品推荐
相关产品推荐

