![](/img/trans.png)
[英]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.