簡體   English   中英

插入unordered_set失敗

[英]Insert into an unordered_set failed

首先,這不是我自己的代碼! 它取自Google的Android源代碼https://android.googlesource.com/platform/art/+/android-9.0.0_r10/tools/hiddenapi/hiddenapi.cc因此, 應該對其進行測試並且應該可以工作! 但是,它在“插入...”點失敗短代碼:

/*...*/
std::unordered_set<std::string> light_greylist_;
/*...*/

/*Caller:*/ OpenApiFile(light_greylist_path_, &light_greylist_);

bool OpenApiFile(const std::string& path, std::unordered_set<std::string>* list) {

  std::ifstream api_file(path, std::ifstream::in);

  for (std::string line; std::getline(api_file, line);) {
/* line IS filled; I've checked it with a simple fprintf(): [this IS my code for testing]*/
    FILE *stream = fopen("test.txt", "a+");
    fprintf(stream, "%s\n", line.c_str());
    fclose(stream);

/* This is the point where it crashes with an "Illegal instruction (core dumped)"*/
    list->insert(line);
  }

  api_file.close();
  return true;
}

怎么了?

我將list作為參考而不是指針。 很難說為什么原始代碼使用指針,因為如果用NULL調用它很可能會崩潰。 還要檢查文件是否已成功打開(即使這次似乎已經成功打開了文件)。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <unordered_set>

bool OpenApiFile(const std::string& path, std::unordered_set<std::string>& list) {

  std::ifstream api_file(path, std::ifstream::in);
  if (!api_file) {
    return false;
  }

  for (std::string line; std::getline(api_file, line);) {
    list.insert(line);
  }

  return true;
}

int main(int argc, char* argv[]) {
  std::vector<std::string> files(argv+1, argv+argc);

  for(auto& light_greylist_path_ : files) {
    std::unordered_set<std::string> light_greylist_;

    if (OpenApiFile(light_greylist_path_, light_greylist_) == false) {
      std::cerr << "failed opening "+light_greylist_path_+"\n";
    } else {
      for(auto& lg : light_greylist_) {
        std::cout << lg << "\n";
      }
    }
  }
  return 0;
}

暫無
暫無

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

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