C ++: ошибка шины: 10 при назначении строки в метод - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь присвоить string, значение которого передается в метод, когда я получил эту ошибку:

Bus error: 10

Мой код:

struct user {
   string username;
   string password;
};

Метод:

user *init_user(const string & username, const string & password){ 
    user *u = (user *)malloc(sizeof(user));
    if (u == NULL){
        return NULL;
    }
    u->username = username;
    u->password = password;
    return u;
 }

Вызов:

user *root = init_user("root", "root");

Я думаю, что ошибка возникает на

u->username = username;
u->password = password;

Компилятор IИспользую is c++11

OS: MacOS

1 Ответ

0 голосов
/ 07 июня 2018

malloc не вызывает конструкторы, поэтому присваиваемые вами строки недопустимы, поэтому SIGBUS.

В C ++ используется new, он выделяет память и вызывает конструктор для вас:

user *init_user(const string & username, const string & password) { 
    user* u = new user;
    u->username = username;
    u->password = password;
    return u;
}

Заводские функции должны возвращать смарт-указатель, например std::unique_ptr, для передачи права собственности и предотвращения утечек памяти:

std::unique_ptr<user> init_user(const string & username, const string & password) { 
    std::unique_ptr<user> u(new user);
    u->username = username;
    u->password = password;
    return u;
}
...