0

ここに私が書いたコードがあります:

class sCircBuffer
{
    public:
        sCircBuffer(void);
        ~sCircBuffer(void);
        double *Data;
        int Size;
        bool Init(int SizeBuffer);
        bool Delete();
}

sCircBuffer :: sCircBuffer(void) //Constructor
{
    Data=NULL; //Initialize input circular buffer
}

sCircBuffer :: ~sCircBuffer(void) //Destructor
{
    delete [] Data; //Initialize input circular buffer
    Data=NULL;
}

bool sCircBuffer :: Init(int SizeBuffer)
{
    delete [] Data; //Initialize input circular buffer
    Data=new double [SizeBuffer]; //Initialize input circular buffer    
    Size=SizeBuffer;
    for (int i=0; i<Size; i++)
        Data[i]=0;
    return true;
}

bool sCircBuffer :: Delete()
{
    delete [] Data; //Initialize input circular buffer
    Data=NULL;
    return true;
}

別のクラスで上記のクラスのオブジェクトを作成しています:

class PerChannel
{
    public:
        PerChannel();
        ~PerChannel();

        sCircBuffer m_InputDataRaw;
}

PerChannel :: PerChannel()
{
    m_InputDataRaw.Init(MAX_NUM_TO_FETCH); // MAX_NUM_TO_FETCH = 1000
}

PerChannel :: ~PerChannel()
{
    m_InputDataRaw.Delete();
}

Coverity と C++ Memory Validator で、PerChannel のコンストラクターでリソース リーク エラーが発生します。

ここで何が問題なのかわかりませんか?

あなたの助けは本当に感謝しています.

ちんたん

4

3 に答える 3

0

もし私があなただったら、たとえば次のようなコンストラクターを定義するなどして、クラスインターフェイスを間違いなく変更します。

sCircBuffer(int サイズ = SOME_USEFUL_VALUE);

それに私の初期バッファを割り当てます。Delete() メソッドはひどいアイデアだと言っておきましょう: Init() メソッド内で削除を処理するだけです (たとえば、Resize() と呼びます)。あなたのクラスのユーザーが内部バッファを削除できるようにします...まあ、それはオブジェクト指向設計のすべてを無効にします。

とにかく、コードをそのままにしておくのに苦労したくない場合は、少なくともコンストラクターに次の行を追加する必要があります。

Size= 0;
Data= new double [Size];

しかし、それを意味のあるサイズに初期化することがより良い解決策になると私はまだ信じています。

于 2013-07-23T14:59:39.390 に答える