我想知道这是使用指针和新指针的好坏方法。 我不想存储超过我需要的内容,因此我创建了一个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));
}
答案 0 :(得分:3)
好吧,你对new
的使用非常糟糕,因为如果第二个原始new
抛出它会确保泄漏。
使用std::string
作为名称变量(或至少某种方式来安全地处理字符串),并至少使用std::make_unique<User>(username)
作为第二个。您还必须修复User
和Accounts
因此,不存在泄漏的风险。
答案 1 :(得分:3)
首先,这段代码更像C而不是C ++。在优秀的现代C ++中,您不应该使用new
和delete
,因为它非常容易出错,并且标准库以更易于维护的方式提供所有相同的行为,例如使用std::string
和std::shared_ptr
以及值语义。
在这个例子中,就C风格代码而言,指针的正确用法并不清楚。这取决于User
构造函数是否获取它传递的指针的所有权,或者它是否将字符串复制到内部成员。
如果User
取得所有权,则不应删除此函数中的username
,但您还应确保User
在其析构函数中正确释放其内存。否则,如果User
未获取指针的所有权,则username
不是必需的,并且将buffer
传递给User
的构造函数就足够了。
那就是说,你的代码混合了C风格和C ++,这是不好的做法。我建议在学习C语言和学习现代C ++之间做出选择。