今天又接到了一个离谱的DEBUG订单

一、BUG程序

#include <iostream>
#include <string>

class Rectangle {
private:
    int width;
    int height;

public:
    Rectangle(int w, int h) {
        width = w;
        height = h;
    }

    void setWidth(int w) {
        width = w;
    }

    void setHeight(int h) {
        height = h;
    }

    int getArea() {
        return width * height;
    }

    int getPerimeter() {
        return 2 * (width + height);
    }

    void printInfo() {
        std::cout << "Rectangle: Width = " << width << ", Height = " << height << std::endl;
    }
};

int main() {
    bool running = true;
    int option;
    Rectangle* rectangle = nullptr;

    while (running) {
        std::cout << "1. Create a rectangle" << std::endl;
        std::cout << "2. Set width" << std::endl;
        std::cout << "3. Set height" << std::endl;
        std::cout << "4. Calculate area" << std::endl;
        std::cout << "5. Calculate perimeter" << std::endl;
        std::cout << "6. Print rectangle info" << std::endl;
        std::cout << "7. Exit" << std::endl;

        std::cout << "Enter option: ";
        std::cin >> option;

        switch (option) {
            case 1: {
                int w, h;
                std::cout << "Enter width: ";
                std::cin >> w;
                std::cout << "Enter height: ";
                std::cin >> h;
                rectangle = new Rectangle(w, h);
                break;
            }
            case 2: {
                int newWidth;
                std::cout << "Enter new width: ";
                std::cin >> newWidth;
                rectangle->setWidth(newWidth);
                break;
            }
            case 3: {
                int newHeight;
                std::cout << "Enter new height: ";
                std::cin >> newHeight;
                rectangle->setHeight(newHeight);
                break;
            }
            case 4: {
                int area = rectangle->getArea();
                std::cout << "Area: " << area << std::endl;
                break;
            }
            case 5: {
                int perimeter = rectangle->getPerimeter();
                std::cout << "Perimeter: " << perimeter << std::endl;
                break;
            }
            case 6: {
                rectangle->printInfo();
                break;
            }
            case 7: {
                running = false;
                break;
            }
            default: {
                std::cout << "Invalid option!" << std::endl;
                break;
            }
        }
        
        delete rectangle;
    }

    return 0;
}

二、分析

1. 内存泄漏:在用户选择创建矩形时,程序会动态分配矩形对象的内存,但在程序结束时没有正确释放内存,导致内存泄漏。
2. 空指针解引用:在用户选择设置宽度或高度时,没有检查是否存在矩形对象的实例,而是直接使用了一个可能为空的指针对象。
3. 逻辑错误:在用户选择设置宽度或高度时,程序应该先检查是否存在矩形对象的实例,再进行相关操作。
4. 默认情况处理:在用户输入无效选项时,程序没有提供相应的处理机制,导致出现未定义的行为。
5. 缺少复制构造函数和赋值运算符重载:矩形类没有实现自定义的复制构造函数和赋值运算符重载,可能导致不正确的对象复制和内存管理问题。

说是还要改成中文…………呵呵

三、修改

#include <iostream>

class Rectangle {
private:
    int width;
    int height;

public:
    Rectangle() {
        width = 0;
        height = 0;
    }

    Rectangle(int w, int h) {
        width = w;
        height = h;
    }

    Rectangle(const Rectangle& other) {
        width = other.width;
        height = other.height;
    }

    ~Rectangle() {
        // 进行必要的资源清理
    }

    Rectangle& operator=(const Rectangle& other) {
        if (this != &other) {
            width = other.width;
            height = other.height;
        }
        return *this;
    }

    void setWidth(int w) {
        width = w;
    }

    void setHeight(int h) {
        height = h;
    }

    int getWidth() const {
        return width;
    }

    int getHeight() const {
        return height;
    }

    int calculateArea() const {
        return width * height;
    }

    int calculatePerimeter() const {
        return 2 * (width + height);
    }
};

int main() {
    Rectangle* rect = nullptr;
    int choice, width, height;

    while (true) {
        std::cout << "1. 创建矩形\n";
        std::cout << "2. 设置宽度\n";
        std::cout << "3. 设置高度\n";
        std::cout << "4. 计算面积\n";
        std::cout << "5. 计算周长\n";
        std::cout << "6. 退出\n";
        std::cout << "请输入选项: ";
        std::cin >> choice;

        if (choice == 1) {
            if (rect != nullptr) {
                delete rect;
            }
            std::cout << "请输入矩形的宽度: ";
            std::cin >> width;
            std::cout << "请输入矩形的高度: ";
            std::cin >> height;
            rect = new Rectangle(width, height);
        } else if (choice == 2) {
            if (rect != nullptr) {
                std::cout << "请输入新的宽度: ";
                std::cin >> width;
                rect->setWidth(width);
            } else {
                std::cout << "还没有创建矩形!\n";
            }
        } else if (choice == 3) {
            if (rect != nullptr) {
                std::cout << "请输入新的高度: ";
                std::cin >> height;
                rect->setHeight(height);
            } else {
                std::cout << "还没有创建矩形!\n";
            }
        } else if (choice == 4) {
            if (rect != nullptr) {
                std::cout << "矩形的面积为: " << rect->calculateArea() << "\n";
            } else {
                std::cout << "还没有创建矩形!\n";
            }
        } else if (choice == 5) {
            if (rect != nullptr) {
                std::cout << "矩形的周长为: " << rect->calculatePerimeter() << "\n";
            } else {
                std::cout << "还没有创建矩形!\n";
            }
        } else if (choice == 6) {
            if (rect != nullptr) {
                delete rect;
            }
            break;
        } else {
            std::cout << "无效的选项,请重新输入。\n";
        }
    }

    return 0;
}
 

四、结局

啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/367475.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

24年2月深度学习

参考&#xff1a; RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL 树结构检索方案。

项目安全-----加密算法实现

目录 对称加密算法 AES &#xff08;ECB模式&#xff09; AES(CBC 模式)。 非对称加密 对称加密算法 对称加密算法&#xff0c;是使用相同的密钥进行加密和解密。使用对称加密算法来加密双方的通信的话&#xff0c;双方需要先约定一个密钥&#xff0c;加密方才能加密&#…

SQL注入:sqli-labs靶场通关(1-37关)

SQL注入系列文章&#xff1a; 初识SQL注入-CSDN博客 SQL注入&#xff1a;联合查询的三个绕过技巧-CSDN博客 SQL注入&#xff1a;报错注入-CSDN博客 SQL注入&#xff1a;盲注-CSDN博客 SQL注入&#xff1a;二次注入-CSDN博客 ​SQL注入&#xff1a;order by注入-CSDN博客 …

uniCloud -- uniIdRouter自动路由

目录 自动路由 云对象响应触发needLogin 获取当前用户信息getCurrentUserInfo 实战应用 个人中心页面 pages.json配置 uni-id自动路由 uni_modules\uni-id-pages/common 登录页面store修改 自动路由 支持的HBuilderX版本 uni-appuni-app x3.5.03.99 uniIdRouter 是一…

RK3568平台 安卓hal3适配usb camera

一.RK安卓hal3 camera框架 Camera hal3 在 android 框架中所处的位置如上图&#xff0c; 对上&#xff0c;主要实现 Framework 一整套 API 接口&#xff0c;响应其 控制命令&#xff0c;返回数据与控制参数结果。 对下&#xff0c; 主要是通 V4l2 框架实现与 kernel 的交互。3a…

c语言---操作符(详解)

目录 一、操作符的分类二、算术操作符三、 移位操作符3.1<<左移操作符3.1.1移位规则3.1.2直接上代码以及解释 3.2>> 右移操作符3.2.1移位规则3.2.2画图解释 3.3注意 四、位操作符&#xff1a;&、|、^、~4.1&按位与4.1.1按位与的计算逻辑4.1.2代码4.1.3运行…

山上有路路难行

原乡情浓 - 邓丽君作词 : Chong Nou作曲 : 汤尼山上有路路难行嘞弯弯曲曲一层又一层嘞小哥要去看小妹嘞不怕山高路不平嘞山上石头大又硬嘞歪歪倒倒一层又一层嘞小哥不怕硬石头嘞只怕小妹心肠硬嘞路边椰树高又高嘞风吹椰树一摇又一授嘞小妹爱哥身体壮嘞可爱小妹身妙条嘞香蕉树上…

机器学习——绪论总结

目录 一、引入 二、基本术语 三、假设空间与归纳偏 四、模型选择 一、引入 机器学习&#xff1a;通过计算手段&#xff0c;得出具有能够自我修改、完善能力的模型&#xff0c;利用经验改善系统自身性能。算法使用数据得到模型的过程即称为学习&#xff0c;或训练 流程&…

前端JavaScript篇之对 rest 参数的理解、ES6中模板语法与字符串处理

目录 对 rest 参数的理解ES6中模板语法与字符串处理 对 rest 参数的理解 rest参数是一种在函数定义中使用的特殊语法&#xff0c;它允许函数接受任意数量的参数&#xff0c;并将它们收集到一个数组中。通俗地说&#xff0c;rest参数就像是一个容器&#xff0c;用来存放函数接收…

cnpm : 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\cnpm.ps1

cnpm命令被禁止使用 我已经安装cnpm &#xff0c;但是使用不了&#xff0c;重新安装也没用。 报错如下图&#xff1a; cnpm无法使用报错 解决问题 1、打开系统Windows PowerShell,使用管理员身份运行。 打开Windows PowerShell 2、输入set-ExecutionPolicy RemoteSigned&a…

深度学习:数据驱动的人工智能革命

文章目录 每日一句正能量前言什么是深度学习推动AI发展不同阶段的“三大驱动 ”1、技术驱动&#xff1a;算法和计算力是主要驱动力2、计算力的三驾马车&#xff1a;芯片、超级计算机、云计算3、数据驱动&#xff1a;描绘个性化画像&#xff1b; 后记 每日一句正能量 一般青年的…

Java数组的遍历

目录 数组的遍历使用for循环遍历数组使用for-each循环遍历数组使用while循环和迭代器遍历数组使用Java 8的流API遍历数组 数组遍历的应用求数组中的最大值查询数组中指定位置的元素将查指定元素对应的索引的功能提取为方法添加数组元素删除数组元素 数组的遍历 Java数组的遍历…

Day17、18、19学习记录

#c语言知识 内存管理 1.作用域 &#xff08;1&#xff09;代码块作用域&#xff08;代码块是{}之间的一段代码&#xff09; &#xff08;2&#xff09;函数作用域 &#xff08;3&#xff09;文件作用域 2.局部变量&#xff08;自动变量auto&#xff09;&#xff1a; 在函…

Matlab plot绘图的 title 语法

x 0:1:10; >> y x.^2 -10*x15; >> plot(x,y) >> title(x_y, interpreter, none) title 里面的 x_y , y不会被当作下标。

软件工程(最简式总结)

目录 第一章:概述 1.软件危机的表现原因 2.常见的软件开发方法包括&#xff1a; 3.软件工程基本原则 4.软件工程三要素 5.设计模式的分类 6.针对变换型数据流设计步骤 7.针对事务型数据流设计步骤 第二章&#xff1a;软件过程 1.软件生命周期 2.软件过程模型 &…

数据结构篇-05:哈希表解决字母异位词分组

本文对应力扣高频100 ——49、字母异位词分组 哈希表最大的特点就是它可以把搜索元素的时间复杂度降到O(1)。这一题就是要我们找到 “字母异位词” 并把它们放在一起。 “字母异位词”就是同一个单词中字母的不同组合形式。判断“字母异位词”有两个视角&#xff1a;1、所含字…

《计算机网络简易速速上手小册》第1章:计算机网络技术基础(2024 最新版)

文章目录 1.1 OSI 模型简介 - 深入探究1.1.1 基础知识1.1.2 重点案例&#xff1a;构建简易 HTTP 服务器1.1.3 拓展案例1&#xff1a;网络层数据包捕获1.1.4 拓展案例2&#xff1a;传输层 TCP 连接 1.2 TCP/IP 协议栈 - 深入探究1.2.1 基础知识1.2.2 重点案例&#xff1a;使用 P…

2.3作业 编写一个shell 脚本,判断输入的是否是数字

#!/bin/bashvar$1 len${#var} j0 for(($j;$j<$len;((j)))) doif [ ${var:$j:1} -eq 0 ]then echo "第$j位数字是0"elif [ ${var:$j:1 } -eq 1 ]then echo "第$j位数字是1"elif [ ${var:$j:1} -eq 2 ]then echo "第$j位数字是2"elif [ ${var:$…

【Linux】理解系统中一个被打开的文件

文件系统 前言一、C语言文件接口二、系统文件接口三、文件描述符四、struct file 对象五、stdin、stdout、stderr六、文件描述符的分配规则七、重定向1. 重定向的原理2. dup23. 重谈 stderr 八、缓冲区1. 缓冲区基础2. 深入理解缓冲区3. 用户缓冲区和内核缓冲区4. FILE 前言 首…

题目: 有1234个数字, 组成多个互不相同且无重复数字的三位数? 都是多少?

lua脚本如下 最原始的解题方法 local str{} local i, j, k0, 0, 0 for i1, 4 do for j1, 4 do for k1, 4 do if i~j and i~k and j~k then str[#str1]i..j..k end end end end print("组成的数有"..#str) print(table.unpack(str)) 运行的结果如下 组成的数有24 1…