В моей программе я пытаюсь разыменовать указатель на структуру Article, чтобы получить ее идентификатор, но я получаю «Место чтения нарушения доступа 0xCCCCCCCC».Я перепробовал много разных вещей, локальные переменные, возвращая указатели обратно в код, разные скобки ... но ничего.У меня нет выбора, и я не вижу проблемы, как бы сильно я ни старался.
Возможно, на этот вопрос может быть ответ, но нарушение доступа является слишком общим, чтобы я мог найти ответЯ ищу (также большинство вопросов касаются массивов, что не в моем случае).
Здесь я определяю простую структуру для хранения моих данных.
struct Article {
public:
std::string id;
std::string title;
std::string text;
Article(std::string article_id, std::string article_title, std::string article_text) : id(article_id), title(article_title), text(article_text) {};
void toString();
};
ДалееЯ использую словарь, который отображает все слова на статьи, где они появляются.Код не сделан сам, но карты слов должны включать в себя все необходимые указатели.
std::map<std::string, std::map<Article*, unsigned>> word_dict_;
Я также оставляю еще один vector<Article> articles_
, где я храню их все, поэтому нет нуляуказатели должны появляться в word_dict _;
Здесь создается словарь.
void fulltext::generateDict() {
for (Article ar : articles_) {
unsigned wordStart;
bool isBuilding = false;
string buffer = "";
for (unsigned int it = 0; it <= ar.text.size(); ++it) {
char c;
if (it < ar.text.size())
c = ar.text.at(it);
else
c = '\0';
if (isalpha(c)) {
// start or middle of word
if (!isBuilding) {
isBuilding = true;
wordStart = it;
}
buffer += c;
}
else {
isBuilding = false;
if (buffer != "") {
stringToLower(buffer); // rewrites buffer to low case
// Here I tried creating &ar just for the laughs and it works just fine.
word_dict_[buffer][&ar] = wordStart;
buffer = "";
}
}
}
}
}
И последнее, но не менее важное: я хочу его распечатать, и вот тут начинается настоящее веселье.
void fulltext::printWordDict() {
cout << "Printing generated word dictionary: " << endl;
for (auto wordPair : word_dict_) {
cout << " \" " << wordPair.first << " \" " << endl;
cout << "There are " << wordPair.second.size() << " inputs." << endl;
for (pair<Article*, unsigned int> articlePair : wordPair.second) {
cout << (articlePair.first)->id << endl; // Here the access violation occurs
// Nothing seemingly works
// cout << articlePair.first->id; ... Access violation
// cout << (*articlePair.first).id; ... Access violation
// auto ar = articlePair.first; cout << ar->id; ... access violation
// auto ar = articlePair.first; cout << (*ar).id; ... access again
}
cout << endl;
}
cout << "Done." << endl;
}
Эти функции вызываются из основной функции fulltext::proccess()
по совпадению в непосредственной последовательности.Word_dict_ является закрытой переменной класса.
Если есть необходимость в каких-либо других частях кода, просто дайте мне знать, хотя ни один из других не должен создавать никаких проблем в этом случае.