C++ 更好的方法是什么?新指针,是否需要删除?
我想知道这是使用指针和新指针的好方法还是坏方法。 我不想存储超过我需要的数据,因此我创建了一个50的缓冲区,用户写下他们的用户名,然后我使用strlen来计算并存储长度+1。以后我是否必须删除用户名?我应该做不同的事情吗 不使用字符串C++ 更好的方法是什么?新指针,是否需要删除?,c++,pointers,C++,Pointers,我想知道这是使用指针和新指针的好方法还是坏方法。 我不想存储超过我需要的数据,因此我创建了一个50的缓冲区,用户写下他们的用户名,然后我使用strlen来计算并存储长度+1。以后我是否必须删除用户名?我应该做不同的事情吗 不使用字符串 void Accounts::newUser() { char buffer[50]; char *username; cout << "username: "; cin.getline(buffer, 50); userna
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));
}
void账户::newUser()
{
字符缓冲区[50];字符*用户名;
cout嗯,你对new
的使用非常糟糕,因为如果第二个原始new
抛出,它会确保泄漏
使用std::string
作为您的name变量(或者至少是安全地处理字符串的某种方式),至少使用std::make_unique(username)
作为第二个变量。您还必须修复User
和Accounts
。
因此,不再存在泄漏的风险。好吧,您使用新
是非常糟糕的,因为如果第二个原始新
抛出,它会确保泄漏
使用std::string
作为您的name变量(或者至少是安全地处理字符串的某种方式),至少使用std::make_unique(username)
作为第二个变量。您还必须修复User
和Accounts
。
因此,不存在泄漏的风险。 < P>首先,该代码读取的内容比C++更像C++。在好的,现代C++中,你不应该真的需要使用<代码>新< /COD>和<代码>删除>代码>,因为它非常容易出错,标准库提供了所有可维护的相同行为,例如使用<代码> STD::string。
和std::shared_ptr
和值语义
在本例中,就C风格代码而言,指针的正确用法与给出的内容不符。这取决于用户构造函数是否拥有它所传递的指针,或者它是否将字符串复制到内部成员
如果User
拥有所有权,则不应在此函数中删除username
,但还应确保User
在其析构函数中正确释放其内存。否则,如果User
不拥有指针的所有权,则不需要username
并传入de>buffer
到User
的构造函数就足够了
<> P>这是你的代码混合了C风格和C++,这是一个很差的练习。我建议在简单的C学习和学习现代C++之间选择.< /P> < P>首先,这个代码读起来更像C,而不是C++。在好的,现代C++中,你不应该真的需要使用<代码>新< /C> >和<代码>删除< /> >,因为它非常容易出错,标准库也是如此。以更易于维护的方式提供所有相同的行为,例如使用std::string
和std::shared_ptr
和值语义
在本例中,就C风格代码而言,指针的正确用法与给出的内容不符。这取决于用户构造函数是否拥有它所传递的指针,或者它是否将字符串复制到内部成员
如果User
拥有所有权,则不应在此函数中删除username
,但还应确保User
在其析构函数中正确释放其内存。否则,如果User
不拥有指针的所有权,则不需要username
并传入de>buffer
到User
的构造函数就足够了
<>你说,代码混合了C风格和C++,这是一个很差的练习。我建议在简单的C学习和学习现代C++之间选择。“我想知道这是不是好的或坏的使用指针和新方法的方法。”没有好的使用原始指针的方法,新的智能指针和新的指针也很少需要。在这种情况下,你需要“代码> STD::String < /Cord>而不是指针。为什么不<代码> STD::String ?那么你的老师并没有教你C++。强大的意大利面怪物知道他/她在教你什么。补充你的正规教育。有了这些。@Deduplicator Ok,当然,有点过度概括了。我愿意为那些没有实现资源处理程序的人加上一句话。“我想知道这是使用指针和新处理器的好方法还是坏方法。”没有好的使用原始指针的方法,新的智能指针和新的指针也很少需要。在这种情况下,你需要“代码> STD::String < /Cord>而不是指针。为什么不<代码> STD::String ?那么你的老师并没有教你C++。强大的意大利面怪物知道他/她在教你什么。补充你的正规教育。有了这些。@Deduplicator Ok,当然,有点过度概括了。我愿意为“没有实现资源处理程序的人”加上一句话。他不能穿着紧身衣和步履蹒跚地做这件事。他不能穿着紧身衣和步履蹒跚地做这件事。