gpt4 book ai didi

c++ - std::string::iterator 的 Linux 段错误

转载 作者:行者123 更新时间:2023-11-30 02:50:04 25 4
gpt4 key购买 nike

我在 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 编译

谢谢!

内特

最佳答案

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

您应该添加一个检查以确保 Line 不是 NULL

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

关于c++ - std::string::iterator 的 Linux 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20765609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com