【发布时间】:2018-11-28 14:33:13
【问题描述】:
在我的程序中,我试图取消引用指向结构文章的指针,以获取其 ID,但我得到“访问冲突读取位置 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_ 是类私有变量。
如果需要代码的任何其他部分,请告诉我,尽管在这种情况下其他任何部分都不会产生任何问题。
【问题讨论】:
-
0xCCCCCCCC 表示未初始化的堆栈内存。 stackoverflow.com/questions/127386/…
-
这发生在调试中,表明您正在取消引用一个未初始化的指针。
-
但是访问冲突对我来说太笼统了 -- 你需要习惯它。 C++ 编程需要调试(和避免)这些问题的知识。但是为什么你会陷入存储任何东西的地址的水平呢?程序的设置不需要低级地址甚至指针。
-
word_dict_[buffer][&ar] = wordStart;在我看来非常可疑。 -
"我尝试了很多不同的东西,局部变量,将指针回溯到代码中,不同的括号......但是什么都没有。" 你有没有尝试过你的使用调试器编写代码,同时观察所有变量的值?
标签: c++ access-violation dereference