在if条件内创建的对象范围?

时间:2018-12-11 16:33:13

标签: c++ scope

我有一个if条件,并且在其中创建了一个对象:

void foo() {
    Student a();
    if ( 2 < 3 ) {
       Student p();
    }
}

我不知道为什么,但是如果条件成立,这个p对象就会被破坏。如何保留此p对象? 预先感谢

我想使此p对象的范围与a对象相同,这意味着在foo()函数结束之前,不应破坏它。有没有办法在if外部声明它,然后在if内部初始化它?

1 个答案:

答案 0 :(得分:-1)

无论何时输入范围,都会“创建”堆栈框架。当您退出范围时,分配给该本地堆栈的所有内容都将被销毁(所有本地堆栈对象的析构函数将以创建的相反顺序被调用)。 如果您这样编写示例,它将变得更加明显:

if (2 < 3)
{
    Student p;
} // scope exit, p's destructor is called

如果要创建一些未知数量的对象,则应使用容器。

#include <vector>
std::vector<Student> students;
if (2 < 3)
{
    Student p;
    students.push_back(p);
}
// use students instead of p

根据评论进行编辑:

不使用容器

#include <iostream>
#include <string>
class Student
{
public:
    std::string lastname, firstname;
};

int main()
{
    Student p; // p is default initialized with empty strings
    if (2 < 3)
    {
        p = Student{"Lastname", "Firstname"}; // Assign a new student to p
    } // p is not destroyed
    std::cout << p.firstname << ' ' << p.lastname << std::endl;
    return 0;
}

使用指针可以在免费商店中创建一个新对象,但是您必须记住要delete

#include <iostream>
#include <string>

class Student
{
public:
    std::string lastname, firstname;
};

int main()
{
    Student *p = (2 < 3) ? new Student : nullptr;
    if(p != nullptr)
        std::cout << p->firstname << ' ' << p->lastname << std::endl;
    delete p; // Remember to clean up
    return 0;
}

使用unique_ptr和RAII(与上面相同,但是指针包裹在unique_ptr中,当指针超出范围时,它将自动删除您的学生)

#include <iostream>
#include <string>
#include <memory>
class Student
{
public:
    std::string lastname, firstname;
};
int main()
{
    std::unique_ptr<Student> p = (2<3) ? std::make_unique<Student>() : nullptr;
    if (p != nullptr)
        std::cout << p->firstname << ' ' << p->lastname << std::endl;
    return 0;
} // Student is automatically deleted when the unique_ptr p goes out of scope