有个代码()打成中文的了,检查了半天 ,好气!
//重新设置存储空间的大小 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群里的一位朋友 给我耐心解释的,这里给了我很大的帮助。帮助我理解 指针 空间 以及异常安全 的使用。