Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更好的方法是什么?新指针,是否需要删除?_C++_Pointers - Fatal编程技术网

C++ 更好的方法是什么?新指针,是否需要删除?

C++ 更好的方法是什么?新指针,是否需要删除?,c++,pointers,C++,Pointers,我想知道这是使用指针和新指针的好方法还是坏方法。 我不想存储超过我需要的数据,因此我创建了一个50的缓冲区,用户写下他们的用户名,然后我使用strlen来计算并存储长度+1。以后我是否必须删除用户名?我应该做不同的事情吗 不使用字符串 void Accounts::newUser() { char buffer[50]; char *username; cout << "username: "; cin.getline(buffer, 50); userna

我想知道这是使用指针和新指针的好方法还是坏方法。 我不想存储超过我需要的数据,因此我创建了一个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));
}
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,当然,有点过度概括了。我愿意为“没有实现资源处理程序的人”加上一句话。他不能穿着紧身衣和步履蹒跚地做这件事。他不能穿着紧身衣和步履蹒跚地做这件事。