2012-04-04 47 views
8

tôi nhận được một ngoại lệ trong khi thực hiện đoạn mã sauTại sao chương trình của tôi gặp sự cố tại bảng sao kê trả lại?

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

chức năng nhận được là như sau

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

gọi của Get chức năng. Tôi không thấy bất kỳ vấn đề nào ở đây.

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 là

[email protected]() + 0x35 bytes  
[email protected]() + 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++ 

giá trị của trường là "ASK".

Mã này đã chạy tốt mà không gặp bất kỳ sự cố nào, nhưng hiện tại tôi đang nhận được ngoại lệ đối với tuyên bố "trả lại đúng".

khi tôi gỡ lỗi mặc dù chương trình ... sstr.fail() trả về false. Con trỏ xuất hiện trên câu lệnh return true;. Tại thời điểm này khi tôi làm một bước duy nhất, đột nhiên tôi nhận được ngoại lệ không thích hợp: Truy cập vi phạm đọc từ vị trí xxxxx. Tôi chưa bao giờ thấy một ngoại lệ trên một tuyên bố trở lại. Điều gì là không chính xác trong trường hợp này? Chương trình C++ này được gọi từ một kịch bản lệnh python.

+1

Mã cho Get (chuỗi, chuỗi) có thể hữu ích. – ergosys

+0

Có lẽ một cái gì đó bên trong 'Get' messes lên ngăn xếp? –

+2

Bạn có thể nhận được một ngoại lệ xung quanh báo cáo trả về nếu một destructor ném một ngoại lệ (nó không phải là thực hành tốt bình thường cho một destructor để ném). Nói rằng, những thứ duy nhất cần hủy là văn bản chuỗi và chuỗi sstr chuỗi, và sẽ rất lạ khi chúng ném. Có thể nguyên nhân của lỗi là ở một số bit không liên quan trực tiếp đến mã của bạn đang làm việc gì đó như bộ đệm tràn hoặc ghi vào bộ nhớ sai, và vấn đề chỉ xảy ra ở đây. –

Trả lời

1

Trả lời bài đăng ở trên thực sự là một bộ sưu tập các nhận xét về câu hỏi. nhiều câu trả lời đã giúp tôi tìm ra giải pháp. Vấn đề trong trường hợp trên là tôi đã không khởi tạo dữ liệu dàn dựng đúng cách. Nó được mong đợi là một mảng có kích thước giống như quote_fields nhưng nó được khởi tạo theo chiều dài 1. Vì vậy, phần tử đầu tiên đã được cập nhật một cách chính xác nhưng trong phần tử thứ hai trong mảng quote_fields mang lại đọc, tôi đã nhận được ở trên ngoại lệ. Ngoại lệ bảo mật không được nâng lên ngay khi tôi cố truy cập phần tử không chính xác. Ngoại lệ là comin từ destructor stringstream. Theo Ninja đã nghỉ hưu, ngoại lệ không được nâng lên ngay lập tức nhưng chỉ cho đến khi heap cố gắng hợp nhất 2 khối miễn phí tại một điểm sau đó như được hiển thị trong ngăn xếp cuộc gọi.

Các vấn đề liên quan