[英]Why is my program returning a garbage value when k == 0 in the for-loop?
[英]Why does my program return garbage when accessing the value of a pointer?
当下面的代码运行时,我得到垃圾输出。 我已经对其进行了足够的调试,以找出尝试访问hobbies[i]->hobby
时出现的错误。 任何帮助,将不胜感激。 我一直在努力弄清楚发生了几个小时的情况。
int Graph::addUserToHobby(std::string hobby, std::string id){
int key = ((int)hobby[0] + (int)hobby[1])%HASHMAP_SIZE;
int collisions = 0;
while(hobbies[key] != NULL && hobbies[key]->hobby.compare(hobby) != 0 ){
key++;
collisions++;
if(key >= HASHMAP_SIZE){
key = 0;
}
}
if(hobbies[key] == NULL){
hobbylist hob;
hob.hobby = hobby;
hob.list.push_back(findVertex(id));
hobbies[key] = &hob;
}
else{
hobbies[key]->list.push_back(findVertex(id));
}
return collisions;
}
void Graph::displayHobbies(){
for(int i=0; i<HASHMAP_SIZE; i++){
if(hobbies[i] != NULL){
cout << hobbies[i]->hobby << ": ";
for(unsigned int j=0; j<hobbies[i]->list.size()-1; j++){
cout << hobbies[i]->list[j]->name << ", ";
}
cout << hobbies[i]->list[hobbies[i]->list.size()-1]->name << endl;
}
}
}
将注意力集中在代码的这一部分:
if(hobbies[key] == NULL) {
hobbylist hob;
...
hobbies[key] = &hob;
}
当hob
超出范围时(在该if语句的正文末尾), hobbies[key]
将引用不再存在的内容。
如您正确注意到的,在程序的后面,当您执行cout << hobbies[i]->hobby;
,您将要求对超出范围的内容进行hobby
,这会调用未定义行为 (UB)。
一些可能的解决方案:
std::map
,而不是现在使用的指针数组。 容器将自动为您处理内存管理。 (推荐的) std::unique_ptr
),而不是原始指针。 在什么是智能指针中阅读更多内容, 何时应该使用它? hob
,以便延长其生命周期(这意味着,如果if语句的主体终止, hob
的生命周期也不会终止)。 这种方法要求您负责内存管理(必须取消分配之前动态分配的每个内存(调用delete
调用次数与调用new
次数相同))。 在这一部分:
if(hobbies[key] == NULL){
hobbylist hob;
/* ... */
hobbies[key] = &hob;
}
hob
在堆栈上分配,并在if块之后删除。 因此,您在hobbies[key]
的指针悬空了。 您可以使用valgrind捕获此类错误。
您的问题是,您要使用指向堆栈上分配的对象的指针来填充您的hobbies
值。
这些物体随后将被销毁。 也许您的意思是将它们分配给new
?
hobbylist* hob = new hobbylist;
...
hobbies[key] = hob
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.