Здравствуйте 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, чтобы не вызывать деструкторы.