數據結構開發(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.pswp.cn/news/250026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250026.shtml
英文地址,請注明出處:http://en.pswp.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…