Допустим, у меня выделена куча A*
, которую я хочу передать в качестве аргумента boost::bind
.
boost::bind
сохраняется для последующей обработки в некоторых STL-подобных контейнерах boost::functions
.
Я хочу убедиться, что A*
будет уничтожено при уничтожении контейнера STL.
Для демонстрации:
A* pA = new A();
// some time later
container.push_back(boost::bind(&SomeClass::HandleA, this, pA);
// some time later
container is destroyed => pA is destroyed too
Как это можно сделать?
EDIT
Может быть, то, что я хочу, не так реалистично.
У меня есть необработанный указатель и функция, которая получает необработанный указатель. Вызов задерживается с помощью boost :: bind . На данный момент я хочу автоматическое управление памятью в случае выполнения boost :: bind. Я ленивый, поэтому я хочу использовать «готовое» решение для интеллектуальных указателей.
std :: auto_ptr выглядит хорошим кандидатом, однако ...
auto_ptr<A> pAutoA(pA);
container.push_back(boost::bind(&SomeClass::HandleA, this, pAutoA);
не компилируется (см. здесь )
auto_ptr<A> pAutoA(pA);
container.push_back(boost::bind(&SomeClass::HandleA, this, boost::ref(pAutoA));
pAutoA уничтожается, удаляя базовый pA.
РЕДАКТИРОВАТЬ 02
В упомянутом контейнере мне нужно будет хранить разные обратные вызовы с разными аргументами. Некоторые из них являются необработанными указателями на объект. Поскольку код старый, я не всегда могу его изменить.
Написание собственной оболочки для хранения обратных вызовов в контейнере - последнее средство (хотя, может быть, единственное), а значит, награда.