Откуда взялся еще один объект (почему вызывается два деструктора)?
Изучаю книгу по 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; }