// PL9/smart1.cpp
// Example of use of smart pointers (RAII)
// Niels Walet, last updated 06/01/2022
#include <iostream>
#include <memory>
using namespace std;
class my_class
{
public:
my_class() { cout << "my_class c'tor\n"; }
my_class(const my_class&) { cout << "my_class copy c'tor\n"; }
my_class(my_class&&) { cout << "my_class move c'tor\n"; }
~my_class() { cout << "~my_class d'tor\n"; }
};
class deleter
{
public:
deleter() {};
deleter(const deleter&) { cout << "deleter copy ctor\n"; }
deleter(deleter&) { cout << "deleter non-const copy ctor\n";}
deleter(deleter&&) { cout << "deleter move ctor \n"; }
void operator()(my_class* p) const {
cout << "deleter is deleting a my_class\n";
delete p;
};
};
int main()
{
cout << "Example constructor(1)...\n";
unique_ptr<my_class> up1; // up1 is empty
unique_ptr<my_class> up1b(nullptr); // up1b is empty
cout << "Example constructor(2)...\n";
{
unique_ptr<my_class> up2(new my_class); //up2 now owns a my_class
} // my_class deleted
cout << "Example constructor(3)...\n";
deleter d;
{ // deleter type is not a reference
unique_ptr<my_class, deleter> up3(new my_class, d); // deleter copied
}
{ // deleter type is a reference
unique_ptr<my_class, deleter&> up3b(new my_class, d); // up3b holds a reference to d
}
cout << "Example constructor(4)...\n";
{ // deleter is not a reference
unique_ptr<my_class, deleter> up4(new my_class, deleter()); // deleter moved
}
cout << "Example constructor(5)...\n";
{
unique_ptr<my_class> up5a(new my_class);
unique_ptr<my_class> up5b(move(up5a)); // ownership transfer
}
cout << "Example constructor(6)...\n";
{
unique_ptr<my_class, deleter> up6a(new my_class, d); // deleter is copied
unique_ptr<my_class, deleter> up6b(move(up6a)); // deleter is moved
unique_ptr<my_class, deleter&> up6c(new my_class, d); // deleter is a reference
unique_ptr<my_class, deleter> up6d(move(up6c)); // deleter is copied
}
cout << "Example constructor(7)...\n";
{
unique_ptr<my_class> up7a(new my_class);
unique_ptr<my_class> up7b(move(up7a)); // ownership transfer
}
}
|