gpt4 book ai didi

c++ - 为什么我的程序在访问指针的值时返回垃圾?

转载 作者:太空宇宙 更新时间:2023-11-04 14:38:58 25 4
gpt4 key购买 nike

当运行下面的代码时,我得到垃圾输出。我已经对其进行了足够的调试,以找出当我尝试访问 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 ),而不是原始指针。阅读更多 What is a smart pointer and when should I use one?
  3. 动态分配hob ,从而延长其使用生命周期(即意味着当 if 语句的主体终止时,hob的生命周期不会终止)。这种方法需要负责内存管理(你必须取消分配每个您之前动态分配的一 block 内存(调用delete和你打的次数一样多new )).

关于c++ - 为什么我的程序在访问指针的值时返回垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53719772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com