#include <iostream>
#include <vector>
using namespace std;
class matrix_rc
{
public:
matrix_rc()
{
inst = new instance;
}
matrix_rc(const matrix_rc& other)
{
cout << "Лёгкое копирование matrix_rc ("
<< (other.inst
? "refcount: " + to_string(other.inst->refcount) + " -> " + to_string(other.inst->refcount + 1)
: "пустой")
<< ")." << endl;
if (other.inst) other.inst->refcount++;
this->inst = other.inst;
}
~matrix_rc()
{
cout << "Лёгкое уничтожение matrix_rc ("
<< (inst
? "refcount: " + to_string(inst->refcount) + " -> " + to_string(inst->refcount - 1)
: "пустой")
<< ")." << endl;
if (inst && --inst->refcount == 0) delete this->inst;
}
private:
class instance
{
friend class matrix_rc;
instance()
{
cout << "Тяжёлое создание matrix_rc::instance (refcount: 1)." << endl;
data = new double[1000 * 1000];
refcount = 1;
}
~instance()
{
cout << "Тяжёлое уничтожение matrix_rc::instance." << endl;
delete[] data;
}
double* data;
size_t refcount;
};
instance* inst;
};
int main()
{
vector<matrix_rc> v;
v.push_back(matrix_rc());
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgbWF0cml4X3JjCnsKcHVibGljOgoJbWF0cml4X3JjKCkKCXsKCQlpbnN0ID0gbmV3IGluc3RhbmNlOwoJfQoKCW1hdHJpeF9yYyhjb25zdCBtYXRyaXhfcmMmIG90aGVyKQoJewoJCWNvdXQgPDwgItCb0ZHQs9C60L7QtSDQutC+0L/QuNGA0L7QstCw0L3QuNC1IG1hdHJpeF9yYyAoIgoJCQk8PCAob3RoZXIuaW5zdAoJCQkJPyAicmVmY291bnQ6ICIgKyB0b19zdHJpbmcob3RoZXIuaW5zdC0+cmVmY291bnQpICsgIiAtPiAiICsgdG9fc3RyaW5nKG90aGVyLmluc3QtPnJlZmNvdW50ICsgMSkKCQkJCTogItC/0YPRgdGC0L7QuSIpCgkJCTw8ICIpLiIgPDwgZW5kbDsKCgkJaWYgKG90aGVyLmluc3QpIG90aGVyLmluc3QtPnJlZmNvdW50Kys7CgkJdGhpcy0+aW5zdCA9IG90aGVyLmluc3Q7Cgl9CgoJfm1hdHJpeF9yYygpCgl7CgkJY291dCA8PCAi0JvRkdCz0LrQvtC1INGD0L3QuNGH0YLQvtC20LXQvdC40LUgbWF0cml4X3JjICgiCgkJCTw8IChpbnN0CgkJCQk/ICJyZWZjb3VudDogIiArIHRvX3N0cmluZyhpbnN0LT5yZWZjb3VudCkgKyAiIC0+ICIgKyB0b19zdHJpbmcoaW5zdC0+cmVmY291bnQgLSAxKQoJCQkJOiAi0L/Rg9GB0YLQvtC5IikKCQkJPDwgIikuIiA8PCBlbmRsOwoKCQlpZiAoaW5zdCAmJiAtLWluc3QtPnJlZmNvdW50ID09IDApIGRlbGV0ZSB0aGlzLT5pbnN0OwoJfQoKcHJpdmF0ZToKCWNsYXNzIGluc3RhbmNlCgl7CgkJZnJpZW5kIGNsYXNzIG1hdHJpeF9yYzsKCQlpbnN0YW5jZSgpCgkJewoJCQljb3V0IDw8ICLQotGP0LbRkdC70L7QtSDRgdC+0LfQtNCw0L3QuNC1IG1hdHJpeF9yYzo6aW5zdGFuY2UgKHJlZmNvdW50OiAxKS4iIDw8IGVuZGw7CgkJCWRhdGEgPSBuZXcgZG91YmxlWzEwMDAgKiAxMDAwXTsKCQkJcmVmY291bnQgPSAxOwoJCQoJCX0KCgkJfmluc3RhbmNlKCkKCQl7CgkJCWNvdXQgPDwgItCi0Y/QttGR0LvQvtC1INGD0L3QuNGH0YLQvtC20LXQvdC40LUgbWF0cml4X3JjOjppbnN0YW5jZS4iIDw8IGVuZGw7CgkJCWRlbGV0ZVtdIGRhdGE7CgkJfQoKCQlkb3VibGUqIGRhdGE7CgkJc2l6ZV90IHJlZmNvdW50OwoJfTsKCglpbnN0YW5jZSogaW5zdDsKfTsKCmludCBtYWluKCkKewoJdmVjdG9yPG1hdHJpeF9yYz4gdjsKCXYucHVzaF9iYWNrKG1hdHJpeF9yYygpKTsKCXJldHVybiAwOwp9