Я использую unique_ptr и получаю странные результаты. Это код:
class Sniffer
{
public:
Sniffer()
{
cout << "Sniffer()" << endl;
s = "String!";
}
void operator()()
{
cout << "operator()(): " << s << endl;
}
~Sniffer()
{
cout << "~Sniffer()" << endl;
}
private:
string s;
};
int main()
{
cout << "Begin scope!" << endl;
{
Sniffer& h = *std::unique_ptr<Sniffer>(new Sniffer()); // 1
//std::unique_ptr<Sniffer> p(new Sniffer()); // 2
//Sniffer& h = *p; // 2
h();
}
cout << "End scope!" << endl;
return 0;
}
Я не понимаю, почему с кодом «1» деструктор вызывается перед оператором()(), а «Конец области!» вообще не печатается. Код не падает, он выполняется до последней строки, я получаю вывод:
Begin scope!
Sniffer()
~Sniffer()
operator()(): Press any key to continue . . .
С другой стороны код «2» ведет себя так, как ожидалось:
Begin scope!
Sniffer()
operator()(): String!
~Sniffer()
End scope!
Press any key to continue . . .
Причина, по которой я использую ссылку, заключается только в том, что я чувствовал, что h()
более естественен, чем (*p)()
или p->operator()()
. Спасибо.