我有一个if条件,并且在其中创建了一个对象:
void foo() {
Student a();
if ( 2 < 3 ) {
Student p();
}
}
我不知道为什么,但是如果条件成立,这个p
对象就会被破坏。如何保留此p
对象?
预先感谢
我想使此p
对象的范围与a
对象相同,这意味着在foo()
函数结束之前,不应破坏它。有没有办法在if
外部声明它,然后在if
内部初始化它?
答案 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