DynamicListテスト

2000 ワード


#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は説明します.
なぜならarray =array; これをarrayは別のアドレスを指し、最後に直接delete[]が削除された別のアドレスの空間である場合.元の住所ではありません.
同じ理屈でT*array=new T[capacity];//ここでなぜm_を直接使わないのか考えてみるarray =.. どうですか.
あなたが直接使ったら;元の1番メモリは野ポインタになりました.解放されていません.ここの1番メモリもスマートポインタではありません.だから自分のdelete[]が必要です.
ここでの異常安全とは、元の1番メモリが異常を引き起こす可能性があることを意味します.異常が発生した場合を保証するためにthis->m_array  this->m_length  m_Capacityは正常なので、一番後ろのdelete 1番メモリに入れます.
これはqq群の友达が私に辛抱強く説明してくれたので、ここは私に大きな助けをくれました.ポインタ空間と異常な安全な使用を理解するのに役立ちます.