为什么字符串上的双自由运算符=
Why the double free on string operator=?
我正在使用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()
一个不存在的对象时,您间接地调用了该"重影"上的析构函数。原来的物体已经被破坏了,因此双自由。
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- C++ 20 中的运算符 == 和 <=> 应该作为成员还是自由函数实现?
- 重载运算符==具有采用模板化迭代程序的自由函数
- 未定义的引用:dll -> 自由函数 ->重载运算符 -> 模板化结构
- 使用继承的成员运算符而不是自由成员运算符
- 为什么在运算符重载中会出现自由错误
- 为什么字符串上的双自由运算符=
- 重载运算符== 作为具有模板化参数的自由函数的语法是什么?