清空包含 char* 的结构数组
Empty an array of struct containing char*
我有一个包含一组 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/free 错误。我搜索了一下也找到了这个post
delete[] an array of objects
但找不到解决方案,有人可以帮我解决这个问题吗?
我也试过了
struct gcp_values {
QString srcX;
QString srcY;
QString dstX;
QString dstY;
};
和它returns同样的错误
我将循环改成了这个,似乎错误消失了
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);}
}
strdup
是一个 POSIX 函数,POSIX 分配内存的函数(不提供特定类型的释放函数,例如 fclose
和 freeaddrinfo
) 期望调用者最终调用 free
来释放分配的内存。
POSIX 没有使用 C++ 内存分配,所以 operator delete[]
这里不正确。
我有一个包含一组 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/free 错误。我搜索了一下也找到了这个post
delete[] an array of objects
但找不到解决方案,有人可以帮我解决这个问题吗?
我也试过了
struct gcp_values {
QString srcX;
QString srcY;
QString dstX;
QString dstY;
};
和它returns同样的错误
我将循环改成了这个,似乎错误消失了
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);}
}
strdup
是一个 POSIX 函数,POSIX 分配内存的函数(不提供特定类型的释放函数,例如 fclose
和 freeaddrinfo
) 期望调用者最终调用 free
来释放分配的内存。
POSIX 没有使用 C++ 内存分配,所以 operator delete[]
这里不正确。