Доброго времени суток!
Можно ли как-то в С++ проверить указатель на доступность области памяти, на которую он указывает?
Ситуация следующая. Есть dll, определяющая класс Delegate, который является представлением функции какого-либо класса (служит для колбэков). Его конструктор имеет примерно следующую сигнатуру:
template<typename T, typename ... Args>
explicit Delegate(T* owner, (T::*function), Args ... args);
Так же перегружен operator(), что позволяет сделать примерно следующее:
class Foo
{
public:
void func() {}
};
Foo* f = new Foo;
Delegate d(f, &Foo::func);
d(); // вызовется f->func();
В классе Delegate, в перегрузке оператора (), как проверить валидность переданного указателя в конструкторе? Сейчас, при следующем раскладе, программа крашнется:
Foo* f = new Foo;
Delegate* d = new Delegate(f, &Foo::func);
delete f;
(*d)(); // здесь будет необработанное исключение
На последней строчке произойдет обращение к недоступной области памяти. В этой части, я разрабатываю только класс Delegate, поэтому я не могу быть уверен, что пользователь после удаления указателя обнулит его. Более того, в следующей ситуации (которая и является целевой) это вроде как и невозможно:
class A
{
public:
A() : delegate_(this, &A::funcA) {}
Delegate callback() const { return delegate_; }
void funcA() {}
private:
Delegate delegate_;
};
class B
{
public:
void setCallback(const Delegate& d)
{ delegate_ = d; }
void event()
{ delegate_(); }
private:
Delegate delegate_;
};
// -------------------------------------
A* classA = new A;
B* classB = new B;
classB->setCallback(classA->callback());
delete classA;
classB->event(); // печаль-беда
Собственно, как мне в классе Delegate, перед вызовом функции на переданном в конструкторе указателе, проверить его на валидность? Программа крашится с "необработанным исключением" по причине "обращения к недоступной области памяти", но даже блок try{} catch(...){} ничего не перехватывает... Как мне обработать такую ситуацию и узнать, что указатель указывает на мусор?