今天又接到了一个离谱的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;
}
 

四、结局

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

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-02-03 22:04:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-03 22:04:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-03 22:04:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-03 22:04:01       18 阅读

热门阅读

  1. MySQL运维实战(5.5) 数据导入导出时的字符集问题

    2024-02-03 22:04:01       31 阅读
  2. 测试工作(新入职)感悟

    2024-02-03 22:04:01       19 阅读
  3. 暴雨信息:算法无处不在,但切忌“算法为王”

    2024-02-03 22:04:01       29 阅读
  4. leetcode121. 买卖股票的最佳时机

    2024-02-03 22:04:01       30 阅读
  5. DOCKER

    DOCKER

    2024-02-03 22:04:01      21 阅读
  6. android tv开发-1,leanback

    2024-02-03 22:04:01       31 阅读
  7. 【学习心得】Python好库推荐——SnowNLP

    2024-02-03 22:04:01       28 阅读
  8. -代码分享-

    2024-02-03 22:04:01       26 阅读
  9. 前端学习03

    2024-02-03 22:04:01       29 阅读