繁体   English   中英

为什么在访问指针的值时程序会返回垃圾?

[英]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)。


一些可能的解决方案:

  1. 使用std::map ,而不是现在使用的指针数组。 容器将自动为您处理内存管理。 (推荐的)
  2. 使用智能指针(例如std::unique_ptr ),而不是原始指针。 什么是智能指针中阅读更多内容, 何时应该使用它?
  3. 动态分配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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM