我之前回答过这个问题,但我错过了一些基本的东西,这意味着它只能在调试模式下工作。我将对 _malloca 的调用移到将自动释放的类的构造函数中。
在调试中这很好,因为它总是在堆上分配。但是,在释放时,它在堆栈上分配,并且在从构造函数返回时,堆栈指针已被重置,并且内存丢失。
我回去采用了不同的方法,结果结合使用宏 (eurgh) 来分配内存并实例化一个将自动在该内存上调用 _freea 的对象。由于它是一个宏,它被分配在同一个堆栈帧中,因此实际上可以在释放模式下工作。它和我的课一样方便,但使用起来略逊一筹。
我做了以下事情:
class EXPORT_LIB_CLASS CAutoMallocAFree
{
public:
CAutoMallocAFree( void *pMem ) : m_pMem( pMem ) {}
~CAutoMallocAFree() { _freea( m_pMem ); }
private:
void *m_pMem;
CAutoMallocAFree();
CAutoMallocAFree( const CAutoMallocAFree &rhs );
CAutoMallocAFree &operator=( const CAutoMallocAFree &rhs );
};
#define AUTO_MALLOCA( Var, Type, Length ) \
Type* Var = (Type *)( _malloca( ( Length ) * sizeof ( Type ) ) ); \
CAutoMallocAFree __MALLOCA_##Var( (void *) Var );
这样我可以使用以下宏调用进行分配,并且在实例化的类超出范围时释放它:
AUTO_MALLOCA( pBuffer, BYTE, Len );
Ar.LoadRaw( pBuffer, Len );
对于发布明显错误的内容,我深表歉意!