我在CentOS 6.4 64位计算机上的libc.so.6内部不断出现异常的段错误。这是gdb最常报告的回溯:

0x00007ffff60d9b3f in memcpy () from /lib64/libc.so.6
(gdb) backtrace
#0  0x00007ffff60d9b3f in memcpy () from /lib64/libc.so.6
#1  0x00000000004b6a6b in std::string::_S_construct<__gnu_cxx::__normal_iterator<char*, std::string> > ()
#2  0x00000000004b719b in NewsMAIL::SMTPClient::receiveLine(std::basic_string<char, std::char_traits<char>, std::allocator<char> >*) ()
#3  0x00000000004b776f in NewsMAIL::SMTPClient::handleResponse() ()

这是有问题的代码,似乎触发了segfault:
bool SMTPClient::receiveLine(std::string* Line)
{
    static std::string Buffer;
    std::string::iterator iter;

    while((iter = std::find(Buffer.begin(), Buffer.end(), '\n')) == Buffer.end()) {

        char Bucket[MAX_BUCKET_SIZE + 1] = {};
        int BytesRecv = read(m_Socket, Bucket, MAX_BUCKET_SIZE);

        //Did we get a socket error?
        if(BytesRecv == -1) {

            //This is generally considered a bad thing..
            *Line = Buffer;
            Buffer = std::string("");
            return false;
        }

        Bucket[BytesRecv] = 0;
        Buffer += Bucket;
    }

    *Line = std::string(Buffer.begin(), iter);
    Buffer = std::string(iter + 1, Buffer.end());

    return true;
}

有时它可以100%正常运行而不会出现任何故障,因此并不是每一次都不幸。
上面的代码是对此的稍微修改后的版本:https://stackoverflow.com/a/1584620/3133245

是否有人对为什么会发生这种情况有任何想法?我正在使用g++ 4.7.2进行编译

谢谢!

内特

最佳答案

使用静态变量(缓冲区)不是线程安全的。可能导致崩溃。

您应该添加一个检查,确认Line不是NULL

顺便说一句,行Buffer = std::string("");可以是Buffer.clear();

09-30 17:53