好的,所以这里有解释它的简单方法,以下代码来自虚幻引擎3游戏的SDK,所以显示的大部分代码都是由一个单独的程序而不是我自己生成的,但是我已经运行了与它有关的问题,我似乎无法解决它。
基本上,这就是我正在调用的行
if (Entity->GetHumanReadableName().Data)
该函数导致非常小的泄漏(在程序崩溃之前累计几个小时)现在我正在使用GetHumanReadableName函数,但是任何返回“FSTRING”的函数都会导致泄漏,对我来说至少意味着我的FSTRING正在泄漏,但我无法弄清楚在哪里。
所以我希望打破每一层,希望你们能和我一起解决这个问题?
struct FString AActor::GetHumanReadableName ( )
{
static UFunction* pFnGetHumanReadableName = NULL;
if ( ! pFnGetHumanReadableName )
pFnGetHumanReadableName = (UFunction*) UObject::GObjObjects()->Data[ 3859 ];
AActor_execGetHumanReadableName_Parms GetHumanReadableName_Parms;
this->ProcessEvent ( pFnGetHumanReadableName, &GetHumanReadableName_Parms, NULL );
return GetHumanReadableName_Parms.ReturnValue;
};
FSTRING结构
struct FString : public TArray< wchar_t >
{
FString() {};
FString ( wchar_t* Other )
{
this->Max = this->Count = *Other ? ( wcslen ( Other ) + 1 ) : 0;
if ( this->Count )
this->Data = Other;
};
~FString() {};
FString operator = ( wchar_t* Other )
{
if ( this->Data != Other )
{
this->Max = this->Count = *Other ? ( wcslen ( Other ) + 1 ) : 0;
if ( this->Count )
this->Data = Other;
}
return *this;
};
};
TARRAY结构
template< class T > struct TArray
{
public:
T* Data;
int Count;
int Max;
public:
TArray()
{
Data = NULL;
Count = Max = 0;
};
public:
int Num()
{
return this->Count;
};
T& operator() ( int i )
{
return this->Data[ i ];
};
const T& operator() ( int i ) const
{
return this->Data[ i ];
};
void Add ( T InputData )
{
Data = (T*) realloc ( Data, sizeof ( T ) * ( Count + 1 ) );
Data[ Count++ ] = InputData;
Max = Count;
};
void Clear()
{
free ( Data );
Count = Max = 0;
};
};
我的意思是,我确定我必须搞乱TARRAY或FSTRING的解构主义者,但我只是不确定我需要做什么...如果你需要更多的代码,请告诉我。< / p>
答案 0 :(得分:3)
当对象被销毁时,需要调用free( Data )
。
在TArray
结构中创建一个调用Clear()
:
~TArray() { Clear(); }
此外,您需要先测试Data
以确保它NULL
free()
之前NULL
(并将其设置为{{1}之后根据Rafael的评论)。因此,在Clear()
方法中,将free()
行更改为:
if ( Data != NULL ) {
free( Data );
Data = NULL; // edit per Rafael Baptista
}