#include <list>
#include <memory>
#include <iostream>
#include <exception>
struct MyClass
{
static int last_number;
MyClass(bool hasBreak)
: number(++last_number)
, hasBreak(hasBreak)
{
std::cout << "MyClass(" << number << ", " << hasBreak << ")" << std::endl;
}
~MyClass()
{
std::cout << "~MyClass(" << number << ", " << hasBreak << ")" << std::endl;
}
int number;
bool hasBreak;
};
int MyClass::last_number = 0;
std::list<std::unique_ptr<MyClass>> create_smart_ptr()
{
std::list<std::unique_ptr<MyClass>> result;
result.emplace_back(new MyClass(false));
result.emplace_back(new MyClass(false));
result.emplace_back(new MyClass(false));
result.emplace_back(new MyClass(false));
result.emplace_back(new MyClass(true));
result.emplace_back(new MyClass(false));
result.emplace_back(new MyClass(false));
return result;
}
std::list<MyClass*> build_no_smart_ptr(std::list<std::unique_ptr<MyClass>>& list)
{
std::list<MyClass*> result;
for (std::unique_ptr<MyClass>& item : list)
{
result.push_back(item.get());
}
return result;
}
void work(std::list<MyClass*>& list)
{
for (MyClass* item : list)
{
if (item->hasBreak)
{
std::cout << "break" << std::endl;
throw std::runtime_error("failed");
}
}
}
int main()
try
{
std::cout << std::boolalpha;
std::list<std::unique_ptr<MyClass>> guard_ptrs(create_smart_ptr());
std::list<MyClass*> no_guard_ptrs(build_no_smart_ptr(guard_ptrs));
work(no_guard_ptrs);
return 0;
}
catch (const std::exception& except)
{
std::cout << except.what();
return 1;
}