C ++内存泄漏问题

时间:2014-10-29 02:10:05

标签: c++ memory-leaks

好的,所以这里有解释它的简单方法,以下代码来自虚幻引擎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>

1 个答案:

答案 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
}