指向对象与向量内存泄漏的指针

时间:2013-04-14 09:58:17

标签: c++ inheritance vector destructor memory-leaks

我似乎对矢量有一点内存泄漏问题。 我的代码如下所示:

    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的大小。所以我猜我必须以某种方式清理那个矢量。我试过了,但无济于事。

3 个答案:

答案 0 :(得分:2)

您需要在CPart中使用virutal destructor

 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;
    }

答案 1 :(得分:0)

您可以使用valgrind通过使用额外的泄漏检查参数来非常精确地隔离内存泄漏的来源,即:

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

只要使用调试符号编译代码,valgrind就会告诉您泄漏的确切位置。

答案 2 :(得分: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),即:

struct CPartition {
     int div_size;
     string disk;
};

要调用div_size实例的CPartition,您应该

instance_of_CPartition->div_size

如需进一步了解,请阅读structure tutorial

我不确定这是否会解决您的问题,但这将解决代码中的另一个问题。