2017-11-11 2 views
-1

char *プロパティのセットを含む構造体があります。空を含む構造体の配列char *

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

よく私はこれらのエラーがでこれらのラインであるIは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 

結果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()); 
    } 

からループでそれを埋めますループ。私は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'ドキュメントには次のような特記があります:*メモリリークを避けるため、返されたポインタをfreeに渡す必要があります。* –

+2

この問題は' struct'に 'QString'を入れるだけで簡単に回避できます。手動でのメモリ管理は困難であり、不要です。それをしないでください。 – nwp

+0

@nwpそれでは、後の関数でchar *が必要なので、Qstringをchar *に変換するにはどうすればいいですか? –

答えて

1

strdupはPOSIXでなくなっているようだ


同じエラーを返します。関数、およびメモリを割り当てるPOSIX関数(型固有の解放の楽しみを提供しませんfcloseおよびfreeaddrinfoなど)は、呼び出し元が最終的にfreeを呼び出して割り当てられたメモリを解放することを期待しています。

POSIXはC++メモリ割り当てを使用しないため、operator delete[]はここでは正しくありません。

+0

ありがとう問題は、私はループを変更し、それが動作するようです。しかし、私はループ内の値を自由にしても動作しますか? –

+0

各ポインタ値を正確に1回解放する限り動作します。 –

+0

もちろん、これはPOSIXに関するものではなく、むしろC APIのようにRAII経由の自動dellocationを持っていないので、C APIです。 –

関連する問題