Hi List!

So, we're finally out there in closed beta. One of the most annyoing issues is a client side crash. The call stack doesn't say all that much, but still: it always happens in the Purge command in the destructor of CUtlVector:

template< typename T, class A >
inline CUtlVector<T, A>::~CUtlVector()
{
    Purge();
}

more precisely, in the CUtlVector< screenshake_t * > . [ There's only one of those, in CViewEffects ].

Now, some questions:

1) any idea why this happens? [ had to ask :D ]
2) if no, any idea on how to debug?
3) Is the following normal? :

// Retire this shake.
delete m_ShakeList.Element( nShake );
m_ShakeList.FastRemove( nShake );
continue;

where:

template< typename T, class A >
void CUtlVector<T, A>::FastRemove( int elem )
{
    Assert( IsValidIndex(elem) );

    Destruct( &Element(elem) );
    if (m_Size > 0)
    {
        memcpy( &Element(elem), &Element(m_Size-1), sizeof(T) );
        --m_Size;
    }
}

and

template <class T>
inline void Destruct( T* pMemory )
{
    pMemory->~T();

#ifdef _DEBUG
    memset( pMemory, 0xDD, sizeof(T) );
#endif
}

Concretely: how come it is allowed to first delete a pointer, and afterwards still call the destructor on it? Is that not dangerous? [ Probably a c++ finesse I'm missing ] Shake works fine most of the time though ( I tried with the console cheat command ), so it's not a reproducible crash yet - but happens very often in online games.

Thanks in advance for any lights shed in the darkness!

-- Maarten

_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please 
visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders

Reply via email to