Re[4]: Взрывоопасная смесь new[]+memmove+delete[]
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.07.02 11:39
Оценка:
Здравствуйте 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 и вылетит по ексепшену (прерыванию).

Конечно, лучше бы представить это всё графически, но нет у меня такой возможности.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.