Unique pointer

class Entity
{
	public:
	Entity()
	{ std::cout << "Created Entity!" << std::endl;}
	~Entity()
	{ std::cout << "Destroyed Entity!" << std::endl;}
	void Print(){}
};

int main()
{
	{
		std::unique_ptr<Entity> entity = std::make_unique<Entity>();
		// std::unique_ptr<Entity> e0 = entity // it doesn't work. (not unique!)
		entity->Print();
		// if it goes out of this scope ( "{}" ), then it is destroyed.
	}
}

Shared pointer

class Entity
{
	public:
	Entity()
	{ std::cout << "Created Entity!" << std::endl;}
	~Entity()
	{ std::cout << "Destroyed Entity!" << std::endl;}
	void Print(){}
};

int main()
{
	{
		std::shared_ptr<Entity> sharedEntity = std::make_shared<Entity>);
		std::shared_ptr<Entity> e0 = sharedEntity // works fine!
		entity->Print();

	}
}

Weak pointer

class Entity
{
	public:
	Entity()
	{ std::cout << "Created Entity!" << std::endl;}
	~Entity()
	{ std::cout << "Destroyed Entity!" << std::endl;}
	void Print(){}
};

int main()
{
	{
		std::shared_ptr<Entity> sharedEntity = std::make_shared<Entity>);
		std::weak_ptr<Entity> weak_ptr = sharedEntity // works fine!
		entity->Print();

	}
}