【发布时间】:2013-12-24 18:59:46
【问题描述】:
我在 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() ()
这是似乎触发段错误的代码:
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 编译
谢谢!
内特
【问题讨论】:
-
除了您有两个答案之外,字符串的
operator+=可以使任何迭代器无效。想象一下,如果需要调整字符串的内部缓冲区大小,就会发生这种情况。
标签: c++ string sockets iterator segmentation-fault