DynamicList测试

    技术2024-08-18  55

    #include <iostream> #include"exception.h" #include "Object.h" #include"SmartPointer.h" #include"List.h" #include "SeqList.h" #include "StaticList.h" #include"DynamicList.h" using namespace std; using namespace DTLib; int main() { DynamicList<int> l(5); for(int i=0;i<l.capacity();i++){ l.insert(0,i); } for(int i=0;i<l.capacity();i++){ cout<<l[i]<<endl; } l[0]*=l[0]; for(int i=0;i<l.capacity();i++){ cout<<l[i]<<endl; } //捕获异常 try{ l[5]=5;} catch(const Exception& e){ cout<<e.message()<<endl; cout<<e.location()<<endl; l.resize(10); l.insert(5,50); } for(int i=0;i<l.capacity();i++){ cout<<l[i]<<endl; } return 0; }

    有个代码()打成中文的了,检查了半天 ,好气!

    //重新设置存储空间的大小 void resize(int capacity) { if(capacity!=m_capacity) { T* array = new T[capacity]; //考虑一下这里为什么不直接用m_array =.. 呢? if(array != NULL ) { //保持原来的顺序 or 或则保持原来所有的数组 int length =(this->m_length < capacity ? this->m_length : capacity); for(int i =0;i<length;i++) { array[i]= this->m_array[i]; } //这个指针 体现了什么 ,如果我不用这个指针 直接delete 有什么问题?? // 这里注释这条语句,直接在最后面 delete[] this->m_array 有什么问题 //T* temp =this->m_array; this->m_array =array; this->m_length = length; this->m_capacity = capacity; delete[] this->m_array; //delete[] temp; } else { THROW_EXCEPTION(NoEnoughMemoryException," resize __ no enough memory for object..."); } } }

    针对问题 为什么不直接 delete[] this->m_array  做一个解释:

    因为  this->m_array =array; 使得 this->m_array 指向了 另外一个地址 ,如果 最后直接delete[] 会是删除的另外一个地址的空间;而不是原来的地址。

    同理 来看看为什么  T* array = new T[capacity];  //考虑一下这里为什么不直接用m_array =.. 呢?

    你直接用了的话; 原来的1号内存就成了野指针了;没有释放,这里1号内存也不是用的智能指针;所以需要自己delete[];

    这里的异常安全指的是 原先的1号内存可能会引起异常;为了保证发生异常的情况下 this->m_array  this->m_length  m_capacity都能正常,所以放在最后面delete 1号内存

    这是qq群里的一位朋友 给我耐心解释的,这里给了我很大的帮助。帮助我理解 指针 空间 以及异常安全 的使用。

    Processed: 0.012, SQL: 9