Я использую boost-variant, и при переключении типов в варианте я хочу, чтобы вызываемый деструктор вызывался. Следующий код «работает», но я не уверен, почему. Я чувствую, что он должен segfault, поскольку он вызывает удаление по неинициализированному указателю. Есть ли какая-то маска с ускорением-модификацией за кулисами?Вызов деструктора для сопоставленного типа в форсированном варианте
#include <iostream>
#include <boost/variant.hpp>
using namespace std;
class A
{
public:
A() {}
virtual ~A() { cout << "Destructing A" << endl; }
};
class B
{
public:
B() {}
virtual ~B() { cout << "Destructing B" << endl; }
};
typedef boost::variant<A*, B*> req;
class delete_visitor : public boost::static_visitor<void>
{
public:
inline void operator() (A *a) const
{
cout << "Will destruct A" << endl;
delete a;
}
inline void operator() (B *b) const
{
cout << "Will destruct B" << endl;
delete b;
}
};
class Wrapper
{
public:
Wrapper(int s) {
setBackend(s);
}
virtual ~Wrapper() {
// cleanup
boost::apply_visitor(delete_visitor(), my_pick);
}
void setBackend(int s)
{
// make sure if we already have put something in our variant, we clean it up
boost::apply_visitor(delete_visitor(), my_pick);
if(s == 0)
my_pick = new A();
else
my_pick = new B();
}
private:
req my_pick;
};
int main()
{
Wrapper *w = new Wrapper(0);
w->setBackend(1);
delete w;
return 0;
}
Ниже то, что я получаю для вывода:
Will destruct A
Will destruct A
Destructing A
Will destruct B
Destructing B
Что заставляет вас думать, что _Boost.Variant_ не назовет соответствующих деструкторов? –
В качестве примечания: вы можете создать шаблон '' operator ('t *)' '' '' '' '' '' '' '' '' '' '' ', потому что он всегда удаляется независимо от типа :-) – Gabriel