更好的方式吗?新指针,删除需要吗?

时间:2018-03-17 20:07:42

标签: c++ pointers

我想知道这是使用指针和新指针的好坏方法。 我不想存储超过我需要的内容,因此我创建了一个50的缓冲区并且用户编写了他们的用户名,我使用strlen来计算它并存储长度+ 1.之后我必须删除用户名?我应该这样做吗?

不使用字符串。

void Accounts::newUser()
{
    char buffer[50]; char *username;
    cout << "username: ";  cin.getline(buffer, 50);
    username = new char[strlen(buffer) + 1]; strcpy(username, buffer);

    // User(char *username) <- parameter
    accountList->add(new User(username));
}

2 个答案:

答案 0 :(得分:3)

好吧,你对new的使用非常糟糕,因为如果第二个原始new抛出它会确保泄漏。

使用std::string作为名称变量(或至少某种方式来安全地处理字符串),并至少使用std::make_unique<User>(username)作为第二个。您还必须修复UserAccounts 因此,不存在泄漏的风险。

答案 1 :(得分:3)

首先,这段代码更像C而不是C ++。在优秀的现代C ++中,您不应该使用newdelete,因为它非常容易出错,并且标准库以更易于维护的方式提供所有相同的行为,例如使用std::stringstd::shared_ptr以及值语义。

在这个例子中,就C风格代码而言,指针的正确用法并不清楚。这取决于User构造函数是否获取它传递的指针的所有权,或者它是否将字符串复制到内部成员。

如果User取得所有权,则不应删除此函数中的username,但您还应确保User在其析构函数中正确释放其内存。否则,如果User未获取指针的所有权,则username不是必需的,并且将buffer传递给User的构造函数就足够了。

那就是说,你的代码混合了C风格和C ++,这是不好的做法。我建议在学习C语言和学习现代C ++之间做出选择。