2017-11-11 134 views
-1

我有一個包含一組char *屬性的結構。清空包含char的結構數組*

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

好,我填補它在一個循環從集合Q對象

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的測試結果,這些OUTPT

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

'strdup'文件特別指出:*必須將返回的指針傳遞給空閒以避免內存泄漏。* –

+2

只需將'QString's放入'struct'中即可避免此問題。手動內存管理是困難和不必要的。不要這樣做。 – nwp

+0

@nwp然後以後如何將Qstring轉換爲char *,因爲我在後面的函數中需要char *。 –

回答

1

strdup是POSIX函數和分配內存的POSIX函數(並且不提供類型特定的釋放樂趣例如fclosefreeaddrinfo)期望調用方最終調用free來釋放分配的內存。

POSIX不使用C++內存分配,所以operator delete[]在這裏不正確。

+0

感謝它是主問題,我改變了循環,它似乎工作。但如果我在循環中釋放值,它是否工作? –

+0

只要您將每個指針值釋放一次,它就會工作。 –

+0

當然,這不是關於POSIX,而是任何C API,因爲C沒有像C++那樣通過RAII自動取消分配。 –

相關問題