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群の友达が私に辛抱強く説明してくれたので、ここは私に大きな助けをくれました.ポインタ空間と異常な安全な使用を理解するのに役立ちます.