簡體   English   中英

BadPtr與矢量 <std::string> 模板函數中的迭代器

[英]BadPtr with vector<std::string> iterator in template function

我有一個解析.csv文件的函數,並使用“,”作為分隔符來標記每一行。 我把它標記為一個向量。 然后我迭代該向量並使用模板函數將每個字符串轉換為數字。 出於某種原因,除了編譯配置之外,它在所有方面都很有效 我不知道配置的細節,因為它們是由不同的部門設置的。 我希望你們看到我在這里所做的事情明顯錯誤,並且可以解決這個問題。

這是有問題的迭代:

vector<std::string> tokens;
tokens = string_split(line);
std::vector<std::string>::iterator it;

for(it = tokens.begin(); it != tokens.end(); it++) {
    int i = 0;
    from_string<int>(i,*it,std::dec);
    if(i != SYS_ELEC_BATTERY_VERSION) {
        SysLoggerMessage("Battery Data does not match this version of the battery model!", MESSAGE_TYPE_ERROR);
        return;
    }
}

因此,在from_string調用之前,*它是“3”。 但是,當我進入from_string函數時:

template <class T>
bool from_string(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&))
{
      std::istringstream iss(s);
      return !(iss >> f >> t).fail();
}

當進入from_string時,s是BadPtr。 為什么這在一些配置中沒有問題而在一個配置中沒有問題,我不知道。 有任何想法嗎?

更新:我還應該提到,無論出於何種原因,這個“發布”配置確實包含調試信息,所以我可以進入這些功能。 在from_string中,變量s在調試器中顯示如下:

"<Bad Ptr>" const std::basic_string<char, std::char_traits<char>,std::allocator<char>> &

再次更新 string_split函數

vector<string> string_split(const string &source, const char *delimiter, bool keepEmpty) {
      vector<string> results;
      size_t prev = 0;
      size_t next = 0;

      while((next = source.find_first_of(delimiter, prev)) != string::npos)
      {
            if(keepEmpty || (next - prev != 0)) {
                  results.push_back(source.substr(prev,next-prev));
            }
            prev = next + 1;
      }
      if(prev < source.size())
      {
            results.push_back(source.substr(prev));
      }
      return results;
}

提前致謝!

所以我終於設法“解決”了這個問題。 我正在使用Visual Studio 2005,在與公司的另一位開發人員交談后,我們得出了這個結論。 無論出於何種原因,VS2005並不總是正確地使用容器編譯庫。 他在一個不相關的項目中遇到了一個非常類似的問題。 這就是“解決”它的原因。

vector<std::string> tokens;
tokens = string_split(line);
std::vector<std::string>::iterator it;

for(size_t index = 0; index < tokens.size(); ++index) {
    int i = 0;
    from_string<int>(i,tokens[index],std::dec);
    if(i != SYS_ELEC_BATTERY_VERSION) {
        SysLoggerMessage("Battery Data does not match this version of the battery model!", MESSAGE_TYPE_ERROR);
        return;
    }
}

請注意,唯一改變的是我迭代向量的方式。 我只是使用size_t來索引向量,而不是使用std :: vector :: iterator。 這現在完美無缺。 我完全失去了編譯器在一個特定配置中打破它的行為。

感謝所有閱讀並提出建議的人。

UPDATE

發現了實際問題。 Win32 Release配置缺少以下預處理器定義:_SECURE_SCL = 0

顯然,這導致我們更大的應用程序環境無法正確捕獲stl容器異常,這些異常在它們為空時總是被拋出。 我並沒有假裝完全理解這一點,因為我無法訪問更廣泛的環境體系結構代碼,但將該行添加到預處理器定義解決了問題,而無需將迭代器更改為索引數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM