1

我有两种工作环境:

  • VirtualBox 上装有 Debian 的笔记本电脑
  • 正常安装相同版本 Debian 的 PC

我正在使用两个系统,因为某些硬件不适用于 VB。项目包括 pthreads 和 ncurses 的使用。

突然,我在 PC 上遇到了一个段错误错误,同时在笔记本电脑 + VB 上一切正常。错误在于未连接到 pthreads 或 ncurses 我正在使用 Eclipse 开发我的软件,迁移项目的过程是:

  1. 从 USB 驱动器上的笔记本电脑复制文件
  2. 将项目导入 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")));

我的问题是双重的:

  1. 为什么即使使用 -O0 我也优化了值?
  2. 我应该寻找什么来找出为什么会发生这种情况?

我知道这是分配或释放内存的事情,但我什至不知道从哪里开始。我试图删除有错误的部分代码,但这在未知的地方给了我更多的错误。

[编辑]@下面的评论:

我发现实际错误在字符串转换运算符重载方法中,但是:

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。

4

0 回答 0