我有两种工作环境:
- VirtualBox 上装有 Debian 的笔记本电脑
- 正常安装相同版本 Debian 的 PC
我正在使用两个系统,因为某些硬件不适用于 VB。项目包括 pthreads 和 ncurses 的使用。
突然,我在 PC 上遇到了一个段错误错误,同时在笔记本电脑 + VB 上一切正常。错误在于未连接到 pthreads 或 ncurses 我正在使用 Eclipse 开发我的软件,迁移项目的过程是:
- 从 USB 驱动器上的笔记本电脑复制文件
- 将项目导入 PC 上的 Eclipse 工作区
到目前为止一切正常。工具链的设置似乎在两者上都是相等的。
代码:
Config::~Config() {
std::map<std::string, Setting*>::iterator configIterator;
for(configIterator = config.begin(); configIterator != config.end(); ++configIterator){
delete configIterator->second;
}
config.clear();
}
seg-fault 出现在删除操作符上。在del之前检查对象是否存在时,看起来它们都在内存中。
这是添加配置条目的方式:
config.insert(std::pair<std::string,Setting*>("language", new Setting("en_en")));
我的问题是双重的:
- 为什么即使使用 -O0 我也优化了值?
- 我应该寻找什么来找出为什么会发生这种情况?
我知道这是分配或释放内存的事情,但我什至不知道从哪里开始。我试图删除有错误的部分代码,但这在未知的地方给了我更多的错误。
[编辑]@下面的评论:
我发现实际错误在字符串转换运算符重载方法中,但是:
Setting::operator std::string(){
std::stringstream sstr;
switch(what){
case STRING: sstr << str; break;
case INT: sstr << i; break;
case FLOAT: sstr << f; break;
default: sstr << str; break;
}
sstr << std::flush;
return sstr.str();
}
当我将其更改为仅返回一些虚拟字符串时,例如 >> return "x" << 没有段错误。那么..上面的代码有什么问题?以及为什么这适用于 VB 而不是 PC。