Откуда взялся еще один объект (почему вызывается два деструктора)?

Изучаю книгу по C++. Начал играться с одним примером косвенного обращения к объекту и увидел такую вещь: во время уничтожения объекта Pointer2 был ожидаемо уничтожен и объект Foo, но при завершении программы какой-то другой объект Foo был снова уничтожен (вызван его деструктор). Какой именно, я понять не могу.

#include <iostream>

class Foo {
public:
  Foo() {std::cout << "Hello world!" << std::endl;}
  Foo(const Foo & other)
  {
    std::cout << "Hello copy world!" << std::endl;
  }
  ~Foo() {std::cout << "Goodby world!" << std::endl;}
  void MemberOfFoo()
  {
    std::cout << "Hello from MemberOfFoo!" << std::endl;
  }

};    

class Pointer {
private:
  Foo* f;
public:
  Pointer(Foo* foo) : f(foo) {}
  ~Pointer()
  {
    delete f;
  }
  Foo* operator->() const { return f; }
};

class Pointer2 {
private:
  Pointer p;
public:
  Pointer2(Foo* foo) : p(foo) {}  
  Pointer operator->() const { return p; }
};    

int main()
{
  {
    Pointer2 p(new Foo);
    p->MemberOfFoo();
    std::cout << "Ok" << std::endl;
  }
  std::cout << "Done" << std::endl;
  return 0;

}

И, самое главное, программа падает при освобождении памяти из под Foo (delete f).


Ответы (1 шт):

Автор решения: Mikhailo

Вот этот оператор

Pointer operator->() const { return p; }

следует сделать такими двумя:

const Pointer& operator->() const { return p; }
Pointer& operator->() { return p; }
→ Ссылка