gpt4 book ai didi

c++ - 在 C++ 中通过引用与通过值将 vector 传递给函数

转载 作者:行者123 更新时间:2023-11-28 02:05:59 24 4
gpt4 key购买 nike

我一直在编写一个小项目来扩展我对 C++ 的了解,但我遇到了一个问题。当我接受一个用户名时,我想检查它是否已经被使用。如果使用了该特定用户名,我会将问题重新打印给用户。它在第一个循环中运行良好,但之后它会接受任何东西,即使它确实存在于用户 Vector 中。

     bool verify(char * a, vector<User> b){
14 for(int i = 0; i < b.size(); i++){
15 if(strcmp(a, b[i].getUsername()) == 0){
16 return false;
17 }
18 }
19 return true;
20 }
21
22 int main(){
23
24 vector<User> users;
25
26 User us1((char *)"foo", (char *)"bar");
27 users.push_back(us1);
28
29
30 do{
31 cout << "Enter Username: ";
32 scanf(" %s", username);
33
34
35 } while(!verify(username, users));
36
37 return 0;
38 }

但是,如果我的函数 verify 取而代之的是 vector & b,它就可以正常工作。有人可以解释为什么会这样吗?

用户.cpp

    User:: User(char * userName, char * passWord){
9
10 this->userName = strdup(userName);
11 this->passWord = strdup(passWord);
12
13 }
14
15 User:: ~User(){
16
17 delete userName;
18 delete passWord;
19
20 }
21
22 void User::getMessage(){
23
24 cout << message << endl;
25 }
26
27 char * User:: getUsername(){
28
29 return userName;
30 }
31
32 char * User :: getPassword(){
33
34 return passWord;
35 }
36
37 void User:: printUser(){
38
39 cout << "User Information" << endl;
40 cout << "Username: "<< userName << endl;
41 cout << "Password: "<< passWord << endl;
42 cout << "Messages: "<< ((message == NULL) ? "User has no messages\n" : "User has 1 message\n");
43
44 }

最佳答案

所有关于使用 std::string 的讨论放在一边,OP 代码中的基本问题是 User 类缺少用户定义的复制构造函数。默认值只会复制 userNamepassWord 字段中的值,从而导致两个 vector (main 中的一个和为verify 函数)指向相同的已分配内存地址。当 verify 返回时,该内存被删除,将 Users 留在 main 的 vector 中,并带有悬空指针(指向释放的内存)。

改用引用可避免这种删除并保持原始 vector 完整。

这就是为什么现在不应该在代码中使用原始指针的原因之一。

关于c++ - 在 C++ 中通过引用与通过值将 vector 传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37504075/

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