Время жизни и полезность объекта, который создается внутри оператора if в методе - PullRequest
0 голосов
/ 16 ноября 2018

Это класс, который я хочу использовать для понимания деструкторов.

#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;объект S класса Student создается, и время жизни объекта заканчивается циклом if.Деструктор вызывается перед строкой после if.Так не должно ли это означать, что создание объектов внутри циклов - просто трата времени, потому что мы больше не можем их использовать?Или они могут быть чем-то полезны?

1 Ответ

0 голосов
/ 17 ноября 2018

Я не совсем уверен, что вы имеете в виду, когда спрашиваете о полезности .

Если вам нужен только один объект, чтобы существовать в течение очень короткого времени, но вы все еще можете удерживать эти данные, вы можете использовать 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 для выполнения других тривиальных вычислений / функций.

...