#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <memory>
#include <map>
#include <set>
class HasPtr
{
public:
HasPtr(std::string const &s = std::string())
: ptr(new std::string(s)), use(new std::size_t(1)) {}
HasPtr(const HasPtr &p)
: ptr(p.ptr), use(p.use)
{
++*use;
std::cout << "copy constructor" << std::endl;
}
~HasPtr()
{
if (--*use == 0)
{
delete ptr;
delete use;
}
}
HasPtr& operator=(const HasPtr &rhs)
{
//++*rhs.use;
if (--*use)
{
delete ptr;
delete use;
}
++*rhs.use;
ptr = rhs.ptr;
use = rhs.use;
std::cout << "operaator=" << std::endl;
return *this;
}
private:
std::string *ptr;
std::size_t *use;
};
void f(HasPtr x) {}
int main()
{
HasPtr h(std::string("xxx"));
h = h;
f(h);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzZXQ+CgpjbGFzcyBIYXNQdHIKewpwdWJsaWM6CglIYXNQdHIoc3RkOjpzdHJpbmcgY29uc3QgJnMgPSBzdGQ6OnN0cmluZygpKQoJCTogcHRyKG5ldyBzdGQ6OnN0cmluZyhzKSksIHVzZShuZXcgc3RkOjpzaXplX3QoMSkpIHt9CglIYXNQdHIoY29uc3QgSGFzUHRyICZwKQoJCTogcHRyKHAucHRyKSwgdXNlKHAudXNlKQoJewoJCSsrKnVzZTsKCQlzdGQ6OmNvdXQgPDwgImNvcHkgY29uc3RydWN0b3IiIDw8IHN0ZDo6ZW5kbDsKCX0KCX5IYXNQdHIoKQoJewoJCWlmICgtLSp1c2UgPT0gMCkKCQl7CgkJCWRlbGV0ZSBwdHI7CgkJCWRlbGV0ZSB1c2U7CgkJfQoJfQoJSGFzUHRyJiBvcGVyYXRvcj0oY29uc3QgSGFzUHRyICZyaHMpCgl7CgkJLy8rKypyaHMudXNlOwoJCWlmICgtLSp1c2UpCgkJewoJCQlkZWxldGUgcHRyOwoJCQlkZWxldGUgdXNlOwoJCX0KCQkrKypyaHMudXNlOwoJCXB0ciA9IHJocy5wdHI7CgkJdXNlID0gcmhzLnVzZTsKCgkJc3RkOjpjb3V0IDw8ICJvcGVyYWF0b3I9IiA8PCBzdGQ6OmVuZGw7CgoJCXJldHVybiAqdGhpczsKCX0KcHJpdmF0ZToKCXN0ZDo6c3RyaW5nICpwdHI7CglzdGQ6OnNpemVfdCAqdXNlOwp9OwoKdm9pZCBmKEhhc1B0ciB4KSB7fQoKaW50IG1haW4oKQp7CglIYXNQdHIgaChzdGQ6OnN0cmluZygieHh4IikpOwoJaCA9IGg7CglmKGgpOwoJcmV0dXJuIDA7Cn0=