Здравствуйте Al-Ko, Вы писали:
AK>когда их копируют из m_pData в pNewData, они копируются в pNewData, а в m_pData остаются, или нет? Их уже два экземпляра, не так ли?Если остаются, то delete[] m_pData должно работать корректно.
AK>Спасибо, я учту замечания и проверю с TYPE c деструкторами — с простыми типами это работает хоть с пятимерными массивами, только Redimension можно делать только последнему измерению (как в SafeArray или бейсиковских массивах)
Введу псевдо-обозначения О(ptr) — объект О типа TYPE имеет указатель на динамически выделяемую память ptr (есть аналогия с классом AKVector), чтобы было видно влияние деструктора.
m_pData-> O0(ptr0),O1(ptr1),...,ON(ptrN), где N=m_nSize
TYPE* pNewData = new TYPE[nNewSize];
pNewData-> O'0(NULL),O'1(NULL),...,O'N(NULL),O'N+1(NULL), где N=m_nSize
memmove(pNewData, m_pData, m_nSize * sizeof(TYPE));
pNewData-> O0(ptr0),O1(ptr1),...,ON(ptrN),O'N+1(NULL), где N=m_nSize
delete [] m_pData;
~O0 освободил ptr0,~O1 освободил ptr1,...,~ON освободил ptrN, где N=m_nSize
m_pData-> O0(ptr0),O1(ptr1),...,ON(ptrN), где N=m_nSize
m_pData = pNewData;
m_pData-> O0(ptr0),O1(ptr1),...,ON(ptrN),O'N+1(NULL), где N=m_nSize
Если теперь попытаться освободить delete [] m_pData; — в деструкторе или методе Add — произойдёт следующее
~O0 будет освобождать ptr0 и вылетит по ексепшену (прерыванию).
Конечно, лучше бы представить это всё графически, но нет у меня такой возможности.