为什么字符串上的双自由运算符=

Why the double free on string operator=?

本文关键字:自由 运算符 字符串 为什么      更新时间:2023-10-16

我正在使用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);
    if (rsltPos != string::npos)
    {
        gotNulls = true;
        retStr.resize(rsltPos);
    }
    return(retStr);
}

挡泥板是否可能抱怨stripNull功能?

谢谢。

您忘记检查是否有要获取的字符串。

当队列为空并且执行.front()时,如果运气不好,您可能会碰巧得到队列中第一个元素的某种"重影"版本。

然后,当您试图.pop()一个不存在的对象时,您间接地调用了该"重影"上的析构函数。原来的物体已经被破坏了,因此双自由。