Re[3]: Взрывоопасная смесь new[]+memmove+delete[]
От: Al-Ko  
Дата: 18.07.02 11:17
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Здравствуйте Al-Ko, Вы писали:


Vi2>
AK>>template<class TYPE>
AK>>void AKVector<TYPE>::Append(long nCount /* = 1 */)
AK>>    {
AK>>        long nNewSize = m_nSize + nCount;
AK>>        
AK>>        TYPE* pNewData =  new TYPE[nNewSize];
Vi2>                             ---
AK>>        if(m_nSize > 0){
AK>>            memmove(pNewData, m_pData, m_nSize * sizeof(TYPE));
Vi2>               --------
AK>>            delete [] m_pData;
Vi2>               -------
AK>>        }

AK>>        m_nSize = nNewSize;
AK>>        m_pData = pNewData;
AK>>    }
Vi2>


Vi2>Взрывоопасная смесь new[]+memmove+delete[].

Vi2>И как оно только у тебя работает, особенно на двумерных массивах!
Vi2>Было, допустим 10 объектов TYPE в m_pData, их скопировали ПОБАЙТНО в pNewData через memmove(), удалили деструторами в delete[] m_pData и продолжаем ими пользоваться после m_pData = pNewData.

когда их копируют из m_pData в pNewData, они копируются в pNewData, а в m_pData остаются, или нет? Их уже два экземпляра, не так ли?Если остаются, то delete[] m_pData должно работать корректно.
Спасибо, я учту замечания и проверю с TYPE c деструкторами — с простыми типами это работает хоть с пятимерными массивами, только Redimension можно делать только последнему измерению (как в SafeArray или бейсиковских массивах)


Vi2>Это будет работать более-менее с классами без деструкторов, но с деструкторами, ИМХО, вылетит напрочь.


Vi2>Обычно удаляют память просто через delete (void*) m_pData, чтобы не вызывать деструкторы.
Старый глюк лучше новых двух!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.