【问题标题】:Lifetime and usefulness of an object that is created inside an if statement in a method在方法的 if 语句中创建的对象的生命周期和有用性
【发布时间】:2019-04-20 00:44:22
【问题描述】:

这是我想用来理解析构函数的类。

#include iostream
using namespace std;

class Student{
public:
Student(int num = 0)
{
id = num;
}
}

这是方法

void bar(int a)
{

if( a == 5)
Student S(5);

cout<<"after if"<<endl;

}

问题是如果 a = 5; Student 类的对象 S 被创建,对象的生命周期以 if 循环结束。析构函数在 if 之后的行之前调用。那么这不应该意味着在循环中创建对象只是浪费时间,因为我们不能再使用它们了吗?或者它们能以某种方式有用吗?

【问题讨论】:

  • 你可以在循环中使用它们,非常有用。
  • 如果您有一个循环,而不仅仅是一个if 语句,这是确保在每次迭代开始时将变量重置为已知状态的好方法。
  • "那么这不应该意味着在循环中创建对象只是浪费时间,因为我们不能再使用它们了吗?" 1)你的例子没有甚至包含一个循环。 2)在你的例子中,是的,它没用。然而,在某些情况下,创建一个生命周期限制在特定范围内的对象会很有用(更不用说某些对象有目的的情况,只是在某个内部范围内时,我想到的示例之一是:std::scoped_lock)。
  • 如果您曾经编写过任何算法,那么您很可能使用过仅存在于循环中的原语。他们没用吗?堆栈上的任何东西都是无用的,因为它在主要结束时(或之前)就死了?

标签: c++ object destructor lifetime


【解决方案1】:

当您询问有用性时,我不完全确定您的意思。

如果您只需要一个对象存在很短的时间,但您仍可能希望保留该数据,您可以使用 std::shared_ptr 来使用智能指针来动态分配内存对于堆上的对象。这些对象的访问速度非常快,并且是一种轻松使用它们的简单方法。您可以使用原始指针执行此操作,但智能指针更安全,因为您永远不会因忘记删除原始指针而导致内存泄漏:

std::shared_ptr<Student> stu_ptr;

if (a == 5) 
    stu_ptr = (new (Student(a)));

stu_ptr->someClassFunction();

stu_ptr 在 if 语句之后仍然存在。如果您想要执行多个检查/条件,您可以继续重新分配该 stu_ptr,或者由于共享指针的性质,您可以创建指向同一个 Student 对象的新共享指针以完成其他琐碎的计算/功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-31
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多