1

g++ とマッドフラップを使用しています。コードを実行すると、マッドフラップが二重解放について不平を言っている場所で中止されます。

*** glibc detected *** /mydir/MYMain: double free or corruption (out): 0x0000000002127880 ***

gdb で実行すると、中断する場所を確認できます。

queue<string> logQueue;
void someThreadSpawnFunction() {
    string str;
    while(true) {
       {
           boost::scoped_lock sl( aMutex);
           // thread wait for loqQueue to have item
           str = logQueue.front();    // <---------------    Aborts here.
           logQueue.pop();
       }
       //write out string
}

問題は、std::queue と文字列を間違って使用していないかということです。

コードの他の部分には、次のようなものがあります。

string msg;
// processMessage            -- some bit a of code with stripNull()
logQueue.push(msg);

processMessage で唯一面白いのは、次の関数です。

std::string Log::stripNull(const std::string &str, bool &gotNulls)
{
    std::string retStr = str;

    // strip any trailing NULLs
    size_t rsltPos = retStr.find_first_of('\0', 0);
    if (rsltPos != string::npos)
    {
        gotNulls = true;
        retStr.resize(rsltPos);
    }
    return(retStr);
}

マッドフラップが stripNull 関数について不平を言っている可能性はありますか?

ありがとう。

4

1 に答える 1

3

実際に取得する文字列があることを確認するのを忘れました。

キューが空のときに を実行すると、運が悪いと、キューの最初の要素であったものの一種の「ゴースト」バージョンが発生.front()する可能性があります。

次に、.pop()存在しないオブジェクトを試みているときは、その「ゴースト」でデストラクタを間接的に呼び出しています。元のオブジェクトはすでに破棄されているため、ダブルフリーです。

于 2013-07-04T16:33:39.387 に答える