清空包含char *的struct数组

时间:2017-11-11 09:52:37

标签: c++ arrays qt valgrind

我有一个包含一组char *属性的结构。

struct gcp_values {
char* srcX;
char* srcY;
char* dstX;
char* dstY;
};

我将它从一组qt对象的循环中填充

std::vector<GeoRefLibrary::gcp_values> gcpvalues(vl.size());

    for(int i=0;i<vl.size();i++) {
        gcppoint_ *a = qobject_cast<gcppoint_ *>(vl.at(i).value<QObject *>());
        gcpvalues[i].srcX= strdup(QString::number(a->row()).toStdString().c_str());
        gcpvalues[i].srcY= strdup(QString::number(a->column()).toStdString().c_str());
        gcpvalues[i].dstX= strdup(QString::number(a->lon()).toStdString().c_str());
        gcpvalues[i].dstY= strdup(QString::number(a->lat()).toStdString().c_str());
    }

当我运行valgrind测试时会导致这些结果

12 bytes in 4 blocks are definitely lost in loss record 813 of 19,623
14 bytes in 4 blocks are definitely lost in loss record 889 of 19,623
16 bytes in 1 blocks are definitely lost in loss record 3,621 of 19,623
32 bytes in 4 blocks are definitely lost in loss record 8,851 of 19,623
36 bytes in 4 blocks are definitely lost in loss record 9,134 of 19,623

这些错误是在循环中的那些行。我尝试delete [] gcpvalues但它返回了错误的删除/免费错误。我搜索并发现了这篇文章

delete[] an array of objects

但是找不到解决方案,有人可以帮我解决这个问题吗?

我也试过

    struct gcp_values {
    QString srcX;
    QString  srcY;
   QString  dstX;
    QString  dstY;
};

并返回相同的错误

我把循环改成了这个,似乎错误消失了

for(int i=0;i<vl.size();i++) {
    gcppoint_ *a = qobject_cast<gcppoint_ *>(vl.at(i).value<QObject *>());

      char* srcX = strdup(QString::number(a->row()).toStdString().c_str());
      char* srcY = strdup(QString::number(a->column()).toStdString().c_str());
      char* dstX = strdup(QString::number(a->lon()).toStdString().c_str());
      char* dstY = strdup(QString::number(a->lat()).toStdString().c_str());
      gcpvalues[i].srcX=srcX;
      gcpvalues[i].srcY= srcY;
      gcpvalues[i].dstX= dstX;
      gcpvalues[i].dstY= dstY;
    if(srcX) { free(srcX);}
    if(srcY) { free(srcY);}
    if(dstX) { free(dstX);}
    if(dstY) { free(dstY);}
}

1 个答案:

答案 0 :(得分:1)

strdup是一个POSIX函数,POSIX函数分配内存(并且不提供类型特定的释放函数,如fclosefreeaddrinfo),期望调用者最终调用{ {1}}取消分配已分配的内存。

POSIX不使用C ++内存分配,因此free在这里不正确。