8

次のコードの実行中に例外が発生します

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;
    }        
} 

Get関数は以下の通りです

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;
        }
    }
}

コールスタックは

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」です。

このコードは問題なく正常に実行されていますが、「returntrue」ステートメントで例外が発生しています。

プログラムをデバッグすると...sstr.fail()が返されますfalse。ポインタはreturn true;ステートメントにあります。この時点で、1つの手順を実行すると、突然、未処理の例外が発生します。ロケーションxxxxxからのアクセス違反の読み取り。returnステートメントで例外を見たことがありません。この場合、何が間違っていますか?このc++プログラムは、Pythonスクリプトから呼び出されます。

4

1 に答える 1

1

上記の投稿への回答は、実際には質問に対するコメントのコレクションです。複数の返信が解決策を見つけるのに役立ちました。上記の場合の問題は、ステージングデータを適切に初期化していないことでした。quote_fieldsと同じサイズの配列であると予想されましたが、長さ1に初期化されました。したがって、最初の要素は正しく更新されましたが、quote_fields配列の2番目の要素が読み取りを行うときに、例外を超えていました。間違った要素にアクセスしようとしても、明らかに例外は発生しません。例外は、stringstreamデストラクタからの着信です。Retired Ninjaによると、例外はすぐには発生しませんが、コールスタックに示されているように、ヒープが後の時点で2つの空きブロックをマージしようとするまでのみ発生します。

于 2012-04-11T02:12:02.840 に答える