DynamicList测试


#include 
#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 l(5);
   for(int i=0;i

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

//重新设置存储空间的大小
    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;im_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群里的一位朋友 给我耐心解释的,这里给了我很大的帮助。帮助我理解 指针 空间 以及异常安全 的使用。

你可能感兴趣的:(c++)