#include <iostream>
#include <memory>
using namespace std;

class MyObject {
	private:
	const char* name;
	std::weak_ptr<MyObject> ptr;
	
	public:
	MyObject(const char* n) {
		name = n;
		cout << "create " << name << std::endl;
	}
	
	~MyObject() {
		cout << "delete " << name << std::endl;
	}
	
	void setOther(std::weak_ptr<MyObject> p) {
		ptr = p;
	}
};

int main() {
	// p1 et p2 sont alloué dynamiquement 
	MyObject* p1 = new MyObject("object1");
	MyObject* p2 = new MyObject("object2");
	
	
	// p3 est alloué dynamiquement via un smartpointeur
	std::shared_ptr<MyObject> p3(new MyObject("object3"));

    // p4 et p5 est alloué dynamiquement via un smartpointeur
    // et on fait un lien monodirectionnel de p4 vers p5
    std::shared_ptr<MyObject> p4(new MyObject("object4"));
	std::shared_ptr<MyObject> p5(new MyObject("object5"));
	p4->setOther(p5);
	
	// p6 et p7 est alloué dynamiquement via un smartpointeur
    // et on fait un lien bidirectionnel entre p6 et p7
	std::shared_ptr<MyObject> p6(new MyObject("object6"));
	std::shared_ptr<MyObject> p7(new MyObject("object7"));
	p6->setOther(p7);
	p7->setOther(p6);
	
	cout << std::endl;
	
	delete p1;
	return 0;
}