数据结构开发(7):典型问题分析(Bugfix)

0.目录

1.创建异常对象时的空指针问题

6.StLib 是否有必要增加多维数组类?

1.创建异常对象时的空指针问题

ISSUE 1——创建异常对象时的空指针问题:
1250397-20181215135536434-445524810.png

改进Exception.cpp:
在init函数中改进strdup的赋值方法

void Exception::init(const char* message, const char* file, int line)
{/* message指向的字符串有可能在栈上,有可能在堆空间,还有可能在全局数据区* strdup()将字符串复制一份到堆空间中* file:发生异常的文件名* line:发生异常的行号* m_location的长度加2,一个给":",一个给"\0"*/m_message = (message ? strdup(message) : NULL);if( file != NULL ){char sl[16] = {0};itoa(line, sl, 10);m_location = static_cast<char*>(malloc(strlen(file) + strlen(sl) + 2));if( m_location != NULL ){m_location = strcpy(m_location, file);m_location = strcat(m_location, ":");m_location = strcat(m_location, sl);}}else{m_location = NULL;}
}

ISSUE 2——LinkList 中的数据元素删除:
1250397-20181215135554864-1199669765.png

单链表的实现没有考虑异常安全性!
改进LinkList.h中的remove函数和clear函数:

    bool remove(int i){bool ret = ((0 <= i) && (i < m_length));if( ret ){Node* current = position(i);Node* toDel = current->next;current->next = toDel->next;m_length--;destroy(toDel);}return ret;}void clear(){while ( m_header.next ){Node* toDel = m_header.next;m_header.next = toDel->next;m_length--;destroy(toDel);}}

ISSUE 3——LinkList 中遍历操作与删除操作的混合使用:
1250397-20181215135615368-233440818.png

混合使用导致了m_current指向了已经被删除的结点,于是程序出错。
改进LinkList.h中的remove函数:

    bool remove(int i){bool ret = ((0 <= i) && (i < m_length));if( ret ){Node* current = position(i);Node* toDel = current->next;if( m_current == toDel ){m_current = toDel->next;}current->next = toDel->next;m_length--;destroy(toDel);}return ret;}

main.cpp测试

#include <iostream>
#include "LinkList.h"using namespace std;
using namespace StLib;int main()
{LinkList<int> list;for(int i=0; i<5; i++){list.insert(i);}for(list.move(0); !list.end(); list.next()){if( list.current() == 3 ){list.remove(list.find(list.current()));cout << list.current() << endl;}}for(int i=0; i<list.length(); i++){cout << list.get(i) << endl;}return 0;
}

运行结果为:

4
0
1
2
4

ISSUE 4——StaticLinkList 中数据元素删除时的效率问题:
1250397-20181215135632678-1283501153.png

改进LinkList.h中的destroy函数:

    void destroy(Node* pn){SNode* space = reinterpret_cast<SNode*>(m_space);SNode* psn = dynamic_cast<SNode*>(pn);for(int i=0; i<N; i++){if( psn == (space + i) ){m_used[i] = 0;psn->~SNode();break;}}}

main.cpp测试

#include <iostream>
#include "StaticLinkList.h"using namespace std;
using namespace StLib;int main()
{StaticLinkList<int, 10> list;for(int i=0; i<5; i++){list.insert(i);}list.remove(3);for(int i=0; i<list.length(); i++){cout << list.get(i) << endl;}return 0;
}

运行结果为:

0
1
2
4

ISSUE 5——StaticLinkList 是否需要提供析构函数?:
1250397-20181215135653995-1005923195.png

构造函数与析构函数不会发生多态,于是调用的是父类的析构函数!
改进StaticLinkList.h:
在子类StaticLinkList中实现析构函数:

    ~StaticLinkList(){this->clear();}

6.StLib 是否有必要增加多维数组类?

ISSUE 6——StLib 是否有必要增加多维数组类?
多维数组的本质:数组的数组!

不需要定义多维数组!

使用DynamicArray创建多维数组:

#include <iostream>
#include "DynamicArray.h"using namespace std;
using namespace StLib;int main()
{DynamicArray< DynamicArray<int> > d;d.resize(3);for(int i=0; i<d.length(); i++){d[i].resize(i + 1);}for(int i=0; i<d.length(); i++){for(int j=0; j<d[i].length(); j++){d[i][j] = i * j;}}for(int i=0; i<d.length(); i++){for(int j=0; j<d[i].length(); j++){cout << d[i][j] << " ";}cout << endl;}return 0;
}

运行结果为:

0 
0 1 
0 2 4 

实践经验:

  • 是软件就有bug因此需要不停的迭代升级,解决问题。库是一种特殊的软件产品也会存在各种bug,也需要迭代升级,解决问题。

转载于:https://www.cnblogs.com/PyLearn/p/10123468.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot 使用视图modelandview

1&#xff1a;springboot使用视图解析器&#xff0c;添加依赖 <!-- freemarker模板引擎视图 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency>&…

题解-BOI 2004 Sequence

Problem bzoj & Luogu 题目大意&#xff1a; 给定序列\(\{a_i\}\)&#xff0c;求一个严格递增序列\(\{b_i\}\)&#xff0c;使得\(\sum \bigl |a_i-b_i\bigr|\)最小 Thought 正序&#xff1a;直接对应 逆序&#xff1a;取中位数&#xff08;证明&#xff1a;“医院设置”&am…

【vscode】编译java时报错乱码

报错如下 解决方案 改变终端的编码格式 chcp 946注意: chcp 65001 UTF-8编码chcp 936 GBK2312代码页

搭建集群架构

环境搭建进行规划(磨刀不误砍柴工). 集群架构组成说明. 负载均衡服务器使用Nginx做搭建,(nginx反向代理软件) Nginx01<-------->Nginx02 3台Web网站服务器,Nginx网站web服务功能 2台负载均衡服务器 (对网站的流量进行分流,减少流量对某台服务器的压力) 3台web服务器, (处…

Model、ModelMap和ModelAndView的使用详解

1.前言 最近SSM框架开发web项目&#xff0c;用得比较火热。spring-MVC肯定用过&#xff0c;在请求处理方法可出现和返回的参数类型中&#xff0c;最重要就是Model和ModelAndView了&#xff0c;对于MVC框架&#xff0c;控制器Controller执行业务逻辑&#xff0c;用于产生模型数据…

【mysql】- 初始化

参考 1、写配置文件 在mysql的根目录下创建 my.ini&#xff0c;根目录的截图和输入的内容如下所示。 my.ini的内容如下 [mysql] default-character-setutf8[mysqld] character-set-serverutf8 default-storage-engineINNODB sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,…

【FBI WARNING】一些Noip的黑科技 持续整理!

有疑问或错误尽管评论&#xff01;&#xff01; 下面以C为准。 本文手&#xff08;粘&#xff09;打&#xff08;贴&#xff09;于各大博客之间 有问题。。。。。 我也不懂 max、min的优化 我们知道&#xff0c;打max、min时&#xff0c;要用分支&#xff08;if语句&#xff09…

@PathVariable注解使用

PathVariable是spring3.0的一个新功能&#xff1a;接收请求路径中占位符的值 语法&#xff1a; PathVariable("xxx") 通过 PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中PathVariable(“xxx“) RequestMapping(value”user/{id}/{name}”) 请…

【mysql】- 常用命令

DML - 操作表 SELECT * FROM stu;INSERT INTO stu ( id, NAME ) VALUES ( 1, 张三 );INSERT INTO stu ( id, NAME, sex, birthday, score, email, tel, STATUS ) VALUES( 2, 李四, 男, 1999-11-11, 88.888, lisiitcase.cn, 13812345678, 1 );update stu set sex 女 where nam…

JAVA 框架-Spring-AOP面向切面

AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;我们一般称为面向方面&#xff08;切面&#xff09;编程&#xff0c;作为面向对象的一种补充&#xff0c;用于处理系统中分布于各个模块的横切关注点&#xff0c;比如事务管理、日志、缓存等等。AOP实现的关键…

互相关和卷积的关系

转载于:https://www.cnblogs.com/seisjun/p/10134021.html

Thymeleaf3语法详解

Thymeleaf是Spring boot推荐使用的模版引擎&#xff0c;除此之外常见的还有Freemarker和Jsp。Jsp应该是我们最早接触的模版引擎。而Freemarker工作中也很常见&#xff08;Freemarker教程&#xff09;。今天我们从三个方面学习Thymeleaf的语法&#xff1a;有常见的TH属性&#x…

【mysql】约束、外键约束、多对多关系

1、约束 DROP TABLE IF EXISTS emp;-- 员工表 CREATE TABLE emp (id INT PRIMARY KEY auto_increment, -- 员工id,主键且自增长ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一joindate DATE NOT NULL, -- 入职日期,非空salary DOUBLE(7, 2) NULL, -- 工资,非空…

SSM+Netty项目结合思路

最近正忙于搬家&#xff0c;面试&#xff0c;整理团队开发计划等工作&#xff0c;所以没有什么时间登陆个人公众号&#xff0c;今天上线看到有粉丝想了解下Netty结合通用SSM框架的案例&#xff0c;由于公众号时间限制&#xff0c;我不能和此粉丝单独沟通&#xff0c;再此写一篇…

[6]Windows内核情景分析 --APC

APC&#xff1a;异步过程调用。这是一种常见的技术。前面进程启动的初始过程就是&#xff1a;主线程在内核构造好运行环境后&#xff0c;从KiThreadStartup开始运行&#xff0c;然后调用PspUserThreadStartup&#xff0c;在该线程的apc队列中插入一个APC&#xff1a;LdrInitial…

THYMELEAF 如何用TH:IF做条件判断

TestController 增加一个布尔值数据&#xff0c;并且放在model中便于视图上获取 package com.how2java.springboot.web; import java.util.ArrayList; import java.util.Date; import java.util.List;import org.springframework.stereotype.Controller; import org.springfr…

【mysql】多表查询、左外连接、内连接、练习题

多表查询 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FBdzXkoQ-1659581225088)(C:\Users\L00589~1\AppData\Local\Temp\1659337934641.png)] 左外连接&右外连接 -- 查询emp表所有数据和对应的部门信息 select * from emp left join dept o…

noi2018

day0 笔试没啥问题&#xff0c;基本都是100 day1 时间有点紧&#xff0c;念了2h题目&#xff0c;能写80848&#xff0c;第一题不会可持久化所以只能暴力。第二题感觉没第三个好做。第三题sa乱搞&#xff0c;随机串只hash长度小于20的。 最后几分钟才改过了所有小样例&#xff0…

Python自建collections模块

本篇将学习python的另一个内建模块collections,更多内容请参考:Python学习指南 collections是Python内建的一个集合模块&#xff0c;提供了许多有用的集合类。 namedtuple 我们知道tuple可以表示不变集合&#xff0c;例如&#xff0c;一个点的二维左边就可以表示成&#xff1a;…

Thymeleaf th:include、th:replace使用

最近做到页面数据展示分页的功能&#xff0c;由于每个模块都需要分页&#xff0c;所以每个页面都需要将分页的页码选择内容重复的写N遍&#xff0c;如下所示&#xff1a; 重复的代码带来的就是CtrlC&#xff0c;CtrlV ,于是了解了一下thymeleaf的fragment加载语法以及th:includ…