valgrind在组成中报告了内存泄漏

时间:2018-02-02 09:54:45

标签: c++ memory-leaks valgrind composition

我有一个看起来不错的代码,但是当我运行Valgrind时,它显示了在setNumberOfFields()函数中分配了新字段的字段的泄漏。以下是我的代码的摘录:

class arcField {
public:
    arcField();
    ~arcField();
};

arcField::arcField(){}

arcField::~arcField() {}

class arcRecord {
public:
    char       *recordType;                    
    int         numberOfFields;                 
    arcField   *fields;     

    arcRecord(){}
    ~arcRecord();
    void setNumberOfFields(int num);
};

arcRecord::~arcRecord() {
    if(fields) {
        delete [] fields;
    }
    fields = 0;
}

void arcRecord::setNumberOfFields(int num) {
       if(fields) {
       delete [] fields;
    }
    fields = 0;
    fields = new arcField[num];   // line number 335
}

int main() {
    int index = 1;
    arcRecord records[1];
    for(int i = 0; i <= 1; i++) {
    records[i].setNumberOfFields(index);  
    return 0;
}
  

记录[I] .setNumberOfFields(tmp_int); // valrind.records中的940行是arcRecord类型的对象。

Valgrind输出:

==12647== 8 bytes in 1 blocks are definitely lost in loss record 33 of 642
==12647==    at 0x4A07152: operator new[](unsigned long) (vg_replace_malloc.c:363)
**==12647==    by 0x705BC8: arcRecord::setNumberOfFields(int) (recordFF.cc:335)**
==12647==    by 0x707B2F: arcRecordList::loadConfigFile(cvConfig&) (recordFF.cc:940)
==12647==    by 0x7078C7: arcRecordList::loadConfigFile(char const*) (recordFF.cc:894)
==12647==    by 0x70771D: arcRecordList::arcRecordList(char const*) (recordFF.cc:883)
==12647==    by 0x5EE131: cvComericaArchive::cvComericaArchive() (cvComericaArcFuncs.cc:62)
==12647==    by 0x45581F: ArchInterface::ArchInterface(std::string const&, char const*) (ArchInterface.cc:115)

我不确定为什么它在第335行显示泄漏,而析构函数是为arcField对象调用的。我不确定这个错误。我想arcRecord的析构函数没有被调用,而是没有删除arcField对象。

1 个答案:

答案 0 :(得分:0)

到目前为止,我还不是C ++ / Valgrind的专家,但如果arcRecord::setNumberOfFields多次被称为 ,我认为你可能会有内存泄漏。

在这种情况下,arcField[]中存储的指向fields的指针只会被指向new arcField[num]分配的内存的新指针替换内存中的现有数组实际上没有被删除

析构函数只能删除最近分配的 arcField[]fields点),而不能删除之前分配的 {根本没有指针。

您应该将所有指针初始化为0

char       *recordType = 0;
int         numberOfFields = 0;
arcField   *fields = 0;   

然后在arcRecord::setNumberOfFields中检查是否已设置fields,如果是,请在分配之前将其删除。

void arcRecord::setNumberOfFields(int num) {
    if(fields) {
        delete [] fields;
    }
    fields = new arcField[num];
}