簡體   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