0

ベクトルでメモリリークの問題が少しあるようです。私のコードは次のようになります。

    class CPart {
    public:
        virtual void print() = 0;
    };

    //some other classes

    class CDisk : public CPart {
    public:
        CDisk(int tp, int size);
        ~CDisk();
        virtual void print();
        void AddPartition(int size, const string & dsc);

        static const int MAGNETIC = 0;
        static const int SDD = 1;
    private:

        struct CPartition {
            CPartition(int size, const string & dsc);
            int div_size;
            string disk;
        };
        int type;
        int d_size;
        vector<CPartition> ptts;
    };

    CDisk::CDisk(int tp, int size) {
        type = tp;
        d_size = size;
    }

    CDisk::CPartition::CPartition(int size, const string& dsc) {
        div_size = size;
        disk = dsc;
    }

    void CDisk::AddPartition(int size, const string& dsc) {
        ptts.push_back(CPartition(size, dsc));
    }

    int main(int argc, char** argv) {
        CDisk disk(CDisk::SDD, 5000);
        disk.AddPartition(500, "disk1");
        CPart *disk2 = new CDisk(disk);
        delete disk2;
        return 0;
    }

このコードを valgrind で実行すると、メモリ リークがあり、失われたバイト数はベクトル ptts の項目数 * CPartition のサイズに等しいと表示されます。だから私はどうにかしてそのベクトルをきれいにしなければならないと推測しています。私はそれを試しましたが、役に立ちませんでした。

4

3 に答える 3

3

CPart に仮想デストラクタが必要です

 class CPart {
    public:
        virtual void print() = 0;
        virtual ~CPart(){};
    };

そうしないと、次のシナリオが発生します。

  int main(int argc, char** argv) {
        CDisk disk(CDisk::SDD, 5000);
        disk.AddPartition(500, "disk1");
        CPart *disk2 = new CDisk(disk);//CDisk created
        delete disk2;//But here only CPart is deleted leaving CDisks data in memory
        return 0;
    }
于 2013-04-14T10:02:27.077 に答える
0

この部分が本当に真実だとは思いません。

struct CPartition {
    CPartition(int size, const string & dsc);
     int div_size;
     string disk;
};

CDisk::CPartition::CPartition(int size, const string& dsc) {
    div_size = size;
    disk = dsc;
}

struct CPartitionクラス定義から外してCDisk::CPartition::CPartition(int size, const string& dsc)ieを削除することをお勧めします。

struct CPartition {
     int div_size;
     string disk;
};

div_sizeあなたのインスタンスを呼び出すにCPartition

instance_of_CPartition->div_size

詳しくは、構造チュートリアルをお読みください。

これで質問が解決するかどうかはわかりませんが、コード内の別の問題が解決されます。

于 2013-04-14T10:17:50.653 に答える
0

valgrind を使用して、追加のリーク チェック パラメータを使用することで、メモリ リークの原因を非常に正確に特定できます。つまり、次のようになります。

valgrind --leak-check=full ./a.out

コードがデバッグ シンボルでコンパイルされている限り、valgrind はリークの原因を正確に教えてくれます。

于 2013-04-14T10:04:02.050 に答える