为什么我的程序在return语句中崩溃?

时间:2012-04-04 06:02:45

标签: c++ exception-handling

执行以下代码时出现异常

bool FieldValueMessage::Get(const std::string &field, double & value)
{
    string text;
    if(Get(field,text))
    {
        std::stringstream sstr(text);
        sstr >> value;
        if(sstr.fail())
            return false;
        else
            return true;
    } 
    else 
    {
        return false;
    }        
} 

获取功能如下

bool HashMapMessage::Get(const std::string &field, std::string & value)
{
    Field2Value::iterator i = f2v.find(field);
    if(i==f2v.end()){
        return false;
    } else {
        value = i->second;
        return true;
    }
}

Get函数的调用者。我在这里看不到任何问题。

for(i=quote_fields.begin(),j=0;i!=quote_fields.end();i++,j++){
    if (msg->Get((*i).c_str(),tmp)){
        if(tmp>0 && x->staging_data[j+1]!=tmp){
            x->staging_data[j+1] = tmp;
            has_update = true;
        }
    }
}

Call Stack是

ntdll.dll!_RtlpCoalesceFreeBlocks@16()  + 0x35 bytes    
ntdll.dll!_RtlFreeHeap@12()  + 0x91f bytes  
msvcr90.dll!_free()  + 0xcd bytes   
msvcp90.dll!std::locale::`scalar deleting destructor'()  + 0x19 bytes   
msvcp90.dll!std::ios_base::_Ios_base_dtor()  + 0x39 bytes   
msvcp90.dll!std::basic_stringstream<char,std::char_traits<char>,std::allocator<char> >::`vbase destructor'()  + 0x19 bytes  
asapGeneric.dll!asap::FieldValueMessage::Get(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & field="ASK", double & value=0.055000000000000000)  Line 33 + 0x17 bytes   C++
_hdf.pyd!asap::TradeAndQuoteNormalizer::ParseQuote(asap::FieldValueMessage * msg=0x027194c0, asap::TAQ * taq=0x02716908)  Line 84 + 0x36 bytes  C++

字段的值是“ASK”。

此代码运行正常,没有任何问题,但现在我在“return true”语句中获得异常。

当我通过程序调试时... sstr.fail()返回false。指针出现在return true;语句中。此时,当我执行一个步骤时,突然我得到未处理的异常:从位置xxxxx读取访问冲突。我从来没有在return语句中看到异常。在这种情况下有什么不对?这个c ++程序是从python脚本调用的。

1 个答案:

答案 0 :(得分:1)

对上述帖子的回答实际上是对该问题的评论集合。不止一个回复帮我找到了解决方案。上面的问题是我没有正确初始化登台数据。它应该是一个与quote_fields相同的数组,但是它被初始化为长度1.因此第一个元素被正确更新但是在quote_fields数组的第二个元素中带来了读取,我得到了异常。 一旦我尝试访问不正确的元素,就不会引发异常异常。异常来自stringstream析构函数。根据Retired Ninja,异常不会立即引发,而是直到堆尝试在稍后的位置合并2个空闲块,如调用堆栈中所示。