Вы понимаете, что сравниваете указатели , а не разыменования, верно?
Можете ли вы сказать нам, что произойдет, если вы используете идиому удаления-стирания? Это будет быстро (не так, как ваш код) и правильно:
children.erase(std::remove_if(children.begin(), children.end(),
std::bind1st(std::equal_to<AguiWidget*>(),
widget)));
Также не забудьте сначала удалить указатели.
for_each_if(children.begin(), children.end(),
std::bind1st(std::equal_to<AguiWidget*>(), widget),
Delete());
Конечно, вы должны быть уверены, что два указателя не указывают на один и тот же объект.