Valgrind给我一个无效的读错误:
==37561== Invalid read of size 1
==37561== at 0x7E81: strlen (vg_replace_strmem.c:427)
对于类中的以下代码(我认为可能与尾随\0
有关,但我不确定)。
std::queue<std::string> errorLog; ///< FIFO used to store errors
const char *Monitor::popErrorFromErrorLog() {
if (!errorLog.empty()) {
std::string str = errorLog.front();
errorLog.pop();
return str.c_str();
} else {
return nullptr;
}
}
void Monitor::reportError(std::string s) {
std::ostringstream err;
err << "Error reported: " << s << std::endl;
errorLog.push(err.str());
}
请问这里有什么问题吗?
答案 0 :(得分:3)
您正在返回c_str
- 指向不再存在的std::string
的指针:您将其从堆栈中弹出并将其内容复制到本地变量,然后返回c_str
该局部变量的指针,在函数返回时被销毁。
至于解决方案,为什么不返回std::string
而不是诉诸C字符串?
答案 1 :(得分:1)
std::string str = errorLog.front();
创建了一个本地std::string
。当您使用return str.c_str();
时,您将返回指向std::string
包装的c字符串的指针。一旦返回发生,字符串就会被销毁,现在你已经返回了一个指向超出范围的内存的指针。
我只会返回一个std::string
,所以你不必担心。如果你不能这样做,那么你将不得不动态分配存储(new {}),然后你必须记住在完成后清理它(delete[]
)。